Est-il possible d'ajouter une validation personnalisée à chaque demande lors de l'authentification d'appels d'API Web à l'aide d'un jeton de support?
J'utilise la configuration suivante et l'application valide déjà les jetons JWT correctement.
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) },,
});
Maintenant, comme les jetons sont configurés pour ne jamais expirer, j'aimerais ajouter une étape de validation personnalisée supplémentaire à chaque demande faite avec un jeton porteur afin de pouvoir valider des informations supplémentaires par demande et refuser l'accès si nécessaire.
Où est le bon endroit pour ajouter cette validation pour chaque demande?
Pour ajouter une logique supplémentaire pour authentifier ou valider les jetons entrants:
Écrire un fournisseur personnalisé hérité de OAuthBearerAuthenticationProvider
ou mettre en œuvre IOAuthBearerAuthenticationProvider
dans votre fournisseur d'authentification personnalisé, remplacez/implémentez ValidateIdentity(...)
et/ou RequestToken(...)
pour vérifier le jeton entrant à chaque demande.
Utilisez votre fournisseur personnalisé en l’attribuant à la propriété JwtBearerAuthenticationOptions.Provider
Exemple:
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
// ... other properties here
Provider = new MyCustomTokenAuthenticationProvider()
// ... other properties here
});
Écrire un gestionnaire de jetons personnalisé hérité de JwtSecurityTokenHandler
remplacez toute méthode pertinente que vous souhaitez étendre (il y en a beaucoup!)
Utilisez votre gestionnaire de jetons personnalisé en l'attribuant à la propriété JwtBearerAuthenticationOptions.TokenHandler
Exemple:
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
// ... other properties here
TokenHandler = new MyCustomTokenHandler()
// ... other properties here
});
Le meilleur moyen que je dirais est d'écrire un attribut personnalisé. Vous devez hériter de la classe AuthorizeAttribute
et de la méthode overridde AuthorizeCore
. Vous pouvez y ajouter une validation personnalisée.
Une fois que vous avez terminé, décorez simplement votre contrôleur ou votre méthode avec.
https://msdn.Microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx
Exemple d'implémentation:
public class MyCustomAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// your validation here
}
}
Exemple d'utilisation:
[MyCustom]
public ActionResult MyAction()
{
return View();
}