web-dev-qa-db-fra.com

Expiration du jeton Web Api OAuth2

J'essaie de définir un temps d'expiration de jeton de manière dynamique, mais il semble qu'il reste juste par défaut à 20 minutes.

Voici mon ConfigureAuth:

public void ConfigureAuth(IAppBuilder app)
{

        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(""),
            // In production mode set AllowInsecureHttp = false
            AllowInsecureHttp = true
        };

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptions);

}

Voici ma méthode GrantResourceOwnerCredentials:

    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {

        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

        var hasValidLogin = (new login().authenticate(context.UserName, context.Password, "") == "valid");

        if (hasValidLogin == false)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return Task.FromResult<object>(null);
        }

        var oAuthIdentity = CreateIdentity(context);
        var oAuthProperties = CreateProperties(context);

        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, oAuthProperties);

        context.Validated(ticket);
        return Task.FromResult<object>(null);
    }

Et voici ma méthode SetProperties où je peux définir l'expiration:

    public static AuthenticationProperties CreateProperties(OAuthGrantResourceOwnerCredentialsContext context)
    {

        IDictionary<string, string> data = new Dictionary<string, string>
        {
            { "client_id", context.ClientId }
        };

        var response = new AuthenticationProperties(data);
        response.ExpiresUtc = DateTime.Now.AddMonths(1);

        return response;
    }

Même après cela, le jeton revient:

{
  "access_token": ".....",
  "token_type": "bearer",
  "expires_in": 1199,
  "client_id": ".....",
  ".expires": "Fri, 13 Nov 2015 20:24:06 GMT",
  ".issued": "Fri, 13 Nov 2015 20:04:06 GMT"
}

Des idées pour lesquelles je ne peux pas définir l'expiration où je suis actuellement? Ce serveur prendra une variété de clients différents avec des délais d'expiration spécifiés différents, donc je me suis dit que c'était l'endroit pour le faire. Y a-t-il un autre endroit où je devrais faire cela? Merci!

14
user3726393

Le comportement que vous voyez est directement causé par le fait que le serveur d'autorisation OAuth2 rejette toujours votre propre expiration lorsque vous la définissez dans le GrantResourceOwnerCredentials notification (l'autre Grant* les notifications sont également impactées): https://github.com/jchannon/katanaproject/blob/master/src/Microsoft.Owin.Security.OAuth/OAuthAuthorizationServerHandler.cs#L386

Une solution consiste à définir la date d'expiration dans AuthenticationTokenProvider.CreateAsync (la classe que vous utilisez pour OAuthAuthorizationServerOptions.AccessTokenProvider):

Réglez simplement context.Ticket.Properties.ExpiresUtc avec la date d'expiration de votre choix, et cela devrait fonctionner comme prévu:

public class AccessTokenProvider : AuthenticationTokenProvider
{
    public override void Create(AuthenticationTokenCreateContext context)
    {
        context.Ticket.Properties.ExpiresUtc = // set the appropriate expiration date.

        context.SetToken(context.SerializeTicket());
    }
}

Vous pouvez également consulter AspNet.Security.OpenIdConnect.Server, un fork du serveur d'autorisation OAuth2 proposé par OWIN/Katana qui prend en charge nativement la définition de la date d'expiration à partir de GrantResourceOwnerCredentials: https://github.com/aspnet-contrib/AspNet.Security. OpenIdConnect.Server/tree/dev

11
Pinpoint

Nous avons une situation similaire, avec différents clients qui ont des délais d'expiration de jetons différents, nous voulions donc pouvoir définir l'expiration en conséquence. Dans AuthenticationTokenProvider que nous avons implémenté, nous définissions l'expiration, mais elle était écrasée au moment de la signature du jeton.

La solution qui nous a satisfaits a été de remplacer la méthode TokenEndpoint. Nous pouvons alors implémenter une expiration spécifique au client:

    public override Task TokenEndpoint(OAuthTokenEndpointContext context)
    {
        if (context.TokenIssued)
        {
            // client information
            var accessExpiration = DateTimeOffset.Now.AddSeconds(accessTokenTimeoutSeconds);
            context.Properties.ExpiresUtc = accessExpiration;
        }

        return Task.FromResult<object>(null);
    }

* Modifié pour résoudre une condition de concurrence.

13
Michael

Je vais jeter ceci ici, à partir de maintenant, il existe un moyen plus simple sans créer de nouvelle classe, il s'agit simplement de définir des options:

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
    ...
    AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
    ..
};
2
Erti-Chris Eelmaa

Vous pouvez le définir dans la méthode TokenEndPoint au lieu de la méthode GrantResourceOwnerCredentials. Veuillez voir ma réponse à une question similaire ici .

J'espère que ça aide.

2
jumuro