У меня возникают вопросы по использованию новой инфраструктуры OpenID Connect ASP.Net при добавлении новых претензий во время конвейера аутентификации, как показано в приведенном ниже коде. Я не уверен, насколько "волшебство" происходит за кулисами. Я думаю, что большинство моих вопросов сосредотачиваются вокруг того, что они мало знают о промежуточном программном обеспечении аутентификации OWIN, а не OpenID Connect.
Q1. Должен ли я вручную устанавливать HttpContext.Current.User
и Thread.CurrentPrincipal
из OwinContext.Authentication.User
?
Q2. Я хочу, чтобы добавлять типы объектов к утверждениям, как я использовал с System.IdentityModel.Claims.Claim
. Новый класс System.Security.Claims.Claim
принимает только строковые значения?
Q3. Нужно ли использовать новую оболочку SessionSecurityToken
для моего ClaimsPrincipal
в System.Security.Claims.CurrentPrincipal
для сериализации в файл 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);
},
}
}
);
}