5

Sulla base del grande esempio di Shaun Luttin allo https://stackoverflow.com/a/30857524 sono stato in grado di utilizzare quel codice per generare e consumare token al portatore. Piccole modifiche sono state per ottenere gli ultimi pacchetti:Token portabili JWT con ASP.NET Identity 3

"dependencies": { 
    "Microsoft.AspNet.Authentication.JwtBearer": "1.0.0-rc1-final", 
    "AspNet.Security.OpenIdConnect.Server": "1.0.0-beta4" 
} 

Anche se il codice è un ottimo inizio, non è una soluzione completa che integra w/ASP.NET identità completamente. Ho modificato classe AuthorizationProvider come segue:

public override Task GrantResourceOwnerCredentials(
    GrantResourceOwnerCredentialsContext context) 
{ 
    var user = _userManager.FindByNameAsync(context.UserName).Result; 
    if (user == null) 
    { 
     context.Rejected("The user name or password is incorrect."); 
    } 
    else 
    { 
     var signInManager = context.HttpContext.RequestServices 
      .GetRequiredService<SignInManager<ApplicationUser>>(); 

     if (signInManager.CanSignInAsync(user).Result && 
      _userManager.CheckPasswordAsync(user, context.Password).Result) 
     { 
      var principal = signInManager.CreateUserPrincipalAsync(user).Result; 

      //To avoid leaking confidential data, AspNet.Security.OpenIdConnect.Server 
      //refuses to serialize the claims that don't explicitly specify a destination. 
      foreach (var claim in principal.Claims) 
       claim.WithDestination("token id_token"); 

      context.Validated(principal); 
     } 
     else 
      context.Rejected("The user name or password is incorrect."); 
    } 

    return Task.FromResult(0); 
} 

sto usando CreateUserPrincipalAsync per creare il ClaimsPrincipal per il metodo convalidato. C'è un modo migliore per integrare l'identità di ASP.NET?

+0

Eventuali aggiornamenti su questo? Non riesco a ottenere il 'signInManager', né il' _userManager. Forse vengono iniettati? – Lars

risposta

2

L'implementazione guarda bene, minori 3 osservazioni:

  • Si dovrebbe usare async/await per evitare le chiamate .Result blocco.
  • È consigliabile prendere in considerazione l'implementazione di contromisure a forza bruta, come richiesto dalle specifiche OAuth2: https://tools.ietf.org/html/rfc6749#section-4.3.2. È qualcosa che puoi fare facilmente con Identity 3 in quanto offre supporto nativo per "lockout".
  • È necessario tenere presente che questa implementazione comporterà la serializzazione di tutte le attestazioni (anche personalizzate) associate all'utente, che potrebbero includere dati riservati.

Gli ultimi due punti sono mitigati in OpenIddict (un intero nuovo server OIDC sperimentale che utilizza AspNet.Security.OpenIdConnect.Server internamente), quindi non esitate a dare un'occhiata alla sua implementazione predefinita: https://github.com/openiddict/core/blob/dev/src/OpenIddict.Core/OpenIddictProvider.cs#L353.

Problemi correlati