Ho domande sull'utilizzo del nuovo framework ASP.Net OpenID Connect mentre aggiungo nuovi reclami durante la pipeline di autenticazione come mostrato nel codice sottostante. Non sono sicuro di quanto "magia" stia accadendo dietro le quinte. Penso che la maggior parte delle mie domande riguardino non sapere molto sul middleware di autenticazione OWIN rispetto a OpenID Connect.Come impostare le attestazioni da ASP.Net OpenID Collegare i componenti OWIN?
Q1. Devo impostare manualmente HttpContext.Current.User
e Thread.CurrentPrincipal
da OwinContext.Authentication.User
?
Q2. Voglio la possibilità di aggiungere tipi di oggetto a rivendicazioni come in passato con System.IdentityModel.Claims.Claim
. La nuova classe System.Security.Claims.Claim
accetta solo valori stringa?
Q3. Devo utilizzare il nuovo wrapper SessionSecurityToken
per il mio ClaimsPrincipal
in System.Security.Claims.CurrentPrincipal
per la serializzazione in un cookie - Sto usando app.UseCookieAuthentication(new CookieAuthenticationOptions());
ma ora sono sicuro di ciò che fa esattamente in termini di mantenimento di eventuali richieste aggiuntive che ho aggiunto durante l'evento ?
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);
},
}
}
);
}