Come applicare la convalida personalizzata al token JWT su ogni richiesta per ASP.NET WebApi?

È ansible aggiungere una convalida personalizzata a ciascuna richiesta quando si autenticano le chiamate api Web utilizzando un token al portatore?

Sto usando la seguente configurazione e l’applicazione già convalida correttamente i token JWT.

app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions { AuthenticationType = "jwt", TokenEndpointPath = new PathString("/api/token"), AccessTokenFormat = new CustomJwtFormat(), Provider = new CustomOAuthProvider(), }); app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions { AllowedAudiences = new[] { "all" }, IssuerSecurityTokenProviders = new[] { new SymmetricKeyIssuerSecurityTokenProvider(Config.JWT_Issuer, Config.JWT_Key) },, }); 

Ora, poiché i token sono impostati per non scadere mai, vorrei aggiungere un ulteriore passaggio di convalida personalizzato a ogni richiesta effettuata con un token al portatore, così posso convalidare alcune informazioni aggiuntive per richiesta e negare l’accesso se necessario.

Dov’è il posto giusto per aggiungere questa convalida per ogni richiesta?

Per aggiungere ulteriore logica per autenticare o convalidare i token in arrivo:

1) Utilizzo di un provider di autenticazione

  1. Scrivi un provider personalizzato ereditato da OAuthBearerAuthenticationProvider o implementa IOAuthBearerAuthenticationProvider

  2. nel proprio provider di autenticazione personalizzato, sovrascrivi / implementa ValidateIdentity(...) e / o RequestToken(...) per controllare il token in arrivo con ogni richiesta

  3. Utilizza il tuo provider personalizzato assegnandolo alla proprietà JwtBearerAuthenticationOptions.Provider

Esempio:

 app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions { // ... other properties here Provider = new MyCustomTokenAuthenticationProvider() // ... other properties here }); 

2) Utilizzo di un gestore token

  1. Scrivi un gestore di token personalizzato ereditato da JwtSecurityTokenHandler

  2. sostituisci qualsiasi metodo pertinente che desideri estendere (ce ne sono molti!)

  3. Utilizzare il gestore di token personalizzato assegnandolo alla proprietà JwtBearerAuthenticationOptions.TokenHandler

Esempio:

 app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions { // ... other properties here TokenHandler = new MyCustomTokenHandler() // ... other properties here }); 

Il modo migliore che vorrei dire è scrivere attributi personalizzati. È necessario ereditare la class AuthorizeAttribute e il metodo overridde AuthorizeCore , quindi è ansible aggiungere la convalida personalizzata.

Una volta che hai finito, basta decorare il controller o il metodo con esso.

https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx

Esempio di implementazione:

 public class MyCustomAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { // your validation here } } 

Esame di utilizzo:

 [MyCustom] public ActionResult MyAction() { return View(); }