17

この質問は、タスクを実行するための最良の方法を見つけるのに苦労しているため、構造/設計に関する質問です。

私のMVCアプリでは、ログイン情報プロバイダーとしてDotNetOpenAuth(3.4)を使用しておりFormsAuthentication、Cookieなどの標準を使用しています。

DB内の現在のユーザーテーブルには次のものがあります。

  • UserId(PK、uniqueidentifier)
  • OpenIdIdentifier(nvarchar(255))
  • OpenIdDisplay(nvarchar(255))
  • 表示名(nvarchar(50))
  • メール(nvarchar(50))
  • 電話番号(nvarchar(50))

UserIdはユーザーの明確な識別子であるため(後日、OpenIdプロバイダーを変更できるようになるはずです)、他のテーブルが(ユーザーの場合)リンクするキーです。

これは現在のコードであり、認証が成功すると、一時的なユーザーが作成され、アクションの作成にリダイレクトされます。

        switch (response.Status)
        {
            case AuthenticationStatus.Authenticated:

                FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);

                var users = new UserRepository();
                if (!users.IsOpenIdAssociated(response.ClaimedIdentifier))
                {
                    var newUser = new DueDate.Models.User();
                    newUser.OpenIdIdentifer = response.ClaimedIdentifier;
                    newUser.OpenIdDisplay = response.FriendlyIdentifierForDisplay;

                    TempData["newUser"] = newUser;

                    return this.RedirectToAction("Create");
                }

そして今、質問の核心について:

  1. response.ClaimedIdentifierユーザーに対して保存する正しい情報はありますか?

  2. FormAuthentication.SetAuthCookieフォーム認証に適した方法はありますか?それとももっと良い方法はありますか?

  3. SetAuthCookieを呼び出すと、を除いてユーザーに関連するデータはありませんClaimedIdentifier。私が一貫して彼らを参照している場合は、ユーザーを作成し、それを?の代わりにCookieにUserId保存することをお勧めします。UserIdClaimedIdentifier

  4. そのUserIdをさまざまな場所で使用している場合、Cookieから取得するか、より論理的で便利な場所に保存するにはどうすればよいですか?

少し長蛇の列ができましたが、これを行うための最善の方法を見つけるのに苦労しています/

4

1 に答える 1

26

1. response.ClaimedIdentifier は、ユーザーに対して保存する正しい情報ですか?

はい。また、データベースに保存する列で大文字と小文字が区別されることを確認してください。大文字と小文字を区別する方法を示すテーブル スキーマを次に示します。これは、DotNetOpenAuth プロジェクト テンプレートのデータベース スキーマに由来します。指定された照合順序の「CS」ビットは、Case Sensitive を表します。

CREATE TABLE [dbo].[AuthenticationToken] (
    [AuthenticationTokenId]    INT            IDENTITY (1, 1) NOT NULL,
    [UserId]                   INT            NOT NULL,
    [OpenIdClaimedIdentifier]  NVARCHAR (250) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL,
    [OpenIdFriendlyIdentifier] NVARCHAR (250) NULL,
    [CreatedOn]                DATETIME       NOT NULL,
    [LastUsed]                 DATETIME       NOT NULL,
    [UsageCount]               INT            NOT NULL
);

2. FormAuthentication.SetAuthCookie は、フォーム認証の推奨される方法ですか? それとももっと良い方法がありますか?

ActionResultMVC アプリの場合、メソッドから優先を返すことができるため、間違いなくそうです。

3.SetAuthCookie を呼び出すと、ClailedIdentifier 以外にユーザーに関するデータはありません。一貫して UserId を参照している場合、ユーザーを作成し、その UserId を ClaimedIdentifier の代わりに Cookie に保存することをお勧めしますか?

それは個人的な好みのように聞こえます。しかし、通常は user_id を使用します。これは、ユーザー情報の検索を必要とする HTTP 要求が着信するたびに、データベースの検索が高速になる可能性があるためです。

4.その UserId を多くの場所で使用している場合、Cookie から取得するか、より論理的/有用な別の場所に保存するにはどうすればよいですか?

FormsAuthentication、暗号化された Cookie にユーザー名だけでなく、より多くの情報を保存する方法を提供しますが、それを使用するのは予想以上に困難です。このスニペットは、DotNetOpenAuth の Web SSO RP サンプルからのものです。

const int TimeoutInMinutes = 100; // TODO: look up the right value from the web.config file
var ticket = new FormsAuthenticationTicket(
    2, // magic number used by FormsAuth
    response.ClaimedIdentifier, // username
    DateTime.Now,
    DateTime.Now.AddMinutes(TimeoutInMinutes),
    false, // "remember me"
    "your extra data goes here");

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
Response.SetCookie(cookie);
Response.Redirect(Request.QueryString["ReturnUrl"] ?? FormsAuthentication.DefaultUrl);

次に、これを使用して、将来の HTTP リクエストでその余分なデータを取得できます。

var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null) {
    var ticket = FormsAuthentication.Decrypt(cookie.Value);
    if (!string.IsNullOrEmpty(ticket.UserData)) {
        // do something cool with the extra data here
    }
}
于 2010-02-04T06:35:30.570 に答える