2014-11-28 14 views
11

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); 
        }, 
       } 
      } 
     ); 
    } 

risposta

15

C'è un motivo specifico per cui si aggiunge un nuovo ClaimsIdentity?

Il modo più semplice per fare ciò che si mira è recuperare lo ClaimsIdentity che è stato generato convalidando il token in entrata, tramite ClaimsIdentity claimsId = context.AuthenticationTicket.Identity; una volta ottenuto, basta aggiungere delle attestazioni ad esso. Il resto del middleware si prenderà cura di serializzarlo nel cookie di sessione insieme a tutto il resto, inserire il risultato nell'attuale ClaimsPrincipal e tutte quelle altre cose che sembra si stia tentando di fare manualmente.
HTH
V.

Problemi correlati