0

私はこのテーマを検索しましたが、さらに混乱しています。

フォーム認証Webアプリケーションがあります。古いFormsAuthentication.SetCookieステートメントを変更して、代わりにFormsIdentityを含むGenericPrincipalを作成し、次にいくつかのカスタムクレームを追加してから、SessionAuthenticationModuleを使用してsessionsecuritytokentocookieを記述しました。FederatedAuthenticationと少し混乱しています-トークンを書き込むためにFederatedAuthentication.SessionAuthenticationModuleを使用していますが、これは私の場合はModules( "SessionAuthenticationModule")を使用するのと同じだと思いますか?

とにかく、認証は正常に機能しますが、カスタムクレームは再作成されていません。メンバーシッププロバイダーまたはロールプロバイダーを使用していません-それは重要ですか?

SessionAuthenticationModules、ClaimsAuthenticationManagers、ClaimsTransformationModulesについて読みましたが、これらのどれをどのように使用すべきかわかりません。現在、古いログインコードがあった場所にクレームを追加するだけで(ログインプロセス全体を書き直す時間がありません)、これらのクレームはリクエストごとに自動的に再作成されると期待していました。

何をする必要がありますか-明らかに、データベースを再構築するたびにデータベースにアクセスする必要はありません-それらはCookieに保存され、自動的に再作成されていると思いました。

4

2 に答える 2

1

アプローチは問題ありません。必要なすべてのクレームを含むClaimsPrincipalを作成し、セッションCookieを書き出します。クレーム認証マネージャーは必要ありません。

考えられる落とし穴:

  • ClaimsIdentityを作成するときに、認証タイプを設定してください。そうしないと、クライアントは認証されません。
  • デフォルトでは、セッションCookieにはSSLが必要です(ブラウザはプレーンテキストでCookieを再送信しません)。これは変更できますが、お勧めしません。
于 2013-03-15T17:56:29.527 に答える
0

カスタム ClaimsAuthenticationManager が必要です。一度呼び出されてクレームが追加されます。このカスタム クラスをアプリケーションに登録することを忘れないでください。

public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
    {
        //works only with one default identity
        //In contra to a a default implementation modify incomingPrincipal by adding claims) 
        if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated == true)
        {
            ClaimsIdentity claimsIdentity = incomingPrincipal.Identity as ClaimsIdentity;
            if (claimsIdentity != null)
            {
                IEnumerable<Claim> claims = new Claim[] { };
                claims = claims.Concat(CreateIdsClaims(incomingPrincipal.Identity.Name));
                claims = claims.Concat<Claim>(CreateRoleClaims(GetRolesByName(incomingPrincipal.Identity.Name)));
                claimsIdentity.AddClaims(claims);
            }

            return incomingPrincipal;
        }

        return null;
    }
于 2013-03-15T13:42:04.077 に答える