web-dev-qa-db-ja.com

ASP.Net OpenID Connect OWINコンポーネントからクレームを設定するにはどうすればよいですか?

以下のコードに示すように、認証パイプライン中に新しいクレームを追加しながら、新しいASP.Net OpenIDConnectフレームワークを使用することについて質問があります。舞台裏でどれだけの「魔法」が起こっているのかわかりません。私の質問のほとんどは、OpenID Connectではなく、OWIN認証ミドルウェアについてあまり知らないことに集中していると思います。

Q1。 _HttpContext.Current.User_から_Thread.CurrentPrincipal_と_OwinContext.Authentication.User_を手動で設定する必要がありますか?

Q2。 _System.IdentityModel.Claims.Claim_で使用したように、クレームにオブジェクトタイプを追加する機能が必要です。新しい_System.Security.Claims.Claim_クラスは文字列値のみを受け入れますか?

Q3。 _System.Security.Claims.CurrentPrincipal_のSessionSecurityTokenに新しいClaimsPrincipalラッパーを使用してCookieにシリアル化する必要がありますか?app.UseCookieAuthentication(new CookieAuthenticationOptions());を使用していますが、それが何をするかを確認しますSecurityTokenValidatedイベント中に追加した追加のクレームを維持するという点で正確ですか?

_    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,

                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    SecurityTokenValidated = (context) =>
                    {
                        // retriever caller data from the incoming principal
                        var UPN = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.Name).Value;
                        var db = new SOSBIADPEntities();

                        var user = db.DomainUser.FirstOrDefault(b => (b.EntityName == UPN));

                        if (user == null)
                        {
                            // the caller was not a registered user - throw to block the authentication flow
                            throw new SecurityTokenValidationException();
                        }

                        var applicationUserIdentity = new ClaimsIdentity();
                        applicationUserIdentity.AddClaim(new Claim(ClaimTypes.Name, UPN, ""));
                        applicationUserIdentity.AddClaim(new Claim(ClaimTypes.Sid, user.ID.ToString(CultureInfo.InvariantCulture)));


                        var applications =
                            db.ApplicationUser
                            .Where(x => x.ApplicationChild != null && x.DomainUser.ID == user.ID)
                            .Select(x => x.ApplicationChild).OrderBy(x => x.SortOrder);

                        applications.ForEach(x =>
                            applicationUserIdentity.AddClaim(new Claim(ClaimTypes.System, x.ID.ToString(CultureInfo.InvariantCulture))));

                        context.OwinContext.Authentication.User.AddIdentity(applicationUserIdentity);

                        var hasOutlook = context.OwinContext.Authentication.User.HasClaim(ClaimTypes.System, "1");

                        hasOutlook = hasOutlook;

                        HttpContext.Current.User = context.OwinContext.Authentication.User;
                        Thread.CurrentPrincipal = context.OwinContext.Authentication.User;

                        var usr = HttpContext.Current.User;

                        var c =  System.Security.Claims.ClaimsPrincipal.Current.Claims.Count();


                        return Task.FromResult(0);
                    },
                }
            }
        );
    }
_
14
puri

新しいClaimsIdentityを追加する特定の理由はありますか?

目的を達成する最も簡単な方法は、着信トークンを検証して生成されたClaimsIdentityを取得し、それを取得したら_ClaimsIdentity claimsId = context.AuthenticationTicket.Identity;_を介して、クレームを追加することです。ミドルウェアの残りの部分は、他のすべてと一緒にセッションCookieでシリアル化を処理し、結果を現在のClaimsPrincipalに配置し、手動で実行しようとしているように見える他のすべてのことを行います。
HTH
V。

17
vibronet