web-dev-qa-db-fra.com

Comment appliquer une validation personnalisée au jeton JWT sur chaque demande ASP.NET WebApi?

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?

12
Natan

Pour ajouter une logique supplémentaire pour authentifier ou valider les jetons entrants:

1) Utilisation d'un fournisseur d'authentification

  1. Écrire un fournisseur personnalisé hérité de OAuthBearerAuthenticationProvider ou mettre en œuvre IOAuthBearerAuthenticationProvider

  2. dans votre fournisseur d'authentification personnalisé, remplacez/implémentez ValidateIdentity(...) et/ou RequestToken(...) pour vérifier le jeton entrant à chaque demande.

  3. 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
});

2) Utiliser un gestionnaire de jetons

  1. Écrire un gestionnaire de jetons personnalisé hérité de JwtSecurityTokenHandler

  2. remplacez toute méthode pertinente que vous souhaitez étendre (il y en a beaucoup!)

  3. 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
});
17
Bishoy

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();
}
0
Ismar Mujagic