以下のコードに示すように、認証パイプライン中に新しいクレームを追加しながら、新しい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);
},
}
}
);
}
_
新しいClaimsIdentity
を追加する特定の理由はありますか?
目的を達成する最も簡単な方法は、着信トークンを検証して生成されたClaimsIdentity
を取得し、それを取得したら_ClaimsIdentity claimsId = context.AuthenticationTicket.Identity;
_を介して、クレームを追加することです。ミドルウェアの残りの部分は、他のすべてと一緒にセッションCookieでシリアル化を処理し、結果を現在のClaimsPrincipal
に配置し、手動で実行しようとしているように見える他のすべてのことを行います。
HTH
V。