via net based asp asp.net oauth oauth-2.0 asp.net-web-api owin

asp.net - net - token based authentication in web api 2 via owin



Vencimiento del Token de OAuth2 WebApi (4)

Estoy tratando de establecer un tiempo de caducidad del token de forma dinámica, pero parece que se mantiene el valor predeterminado en 20 minutos.

Aquí está mi 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); }

Aquí está mi método 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); }

Y aquí está mi método SetProperties donde puedo configurar la caducidad:

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; }

Incluso después de eso, el token está regresando:

{ "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" }

¿Alguna idea de por qué no puedo establecer el vencimiento donde estoy actualmente? Este servidor tomará una variedad de clientes diferentes con diferentes tiempos de vencimiento especificados, por lo tanto, pensé que este es el lugar para hacer esto. ¿Hay algún otro lugar en el que debería hacer esto? ¡Gracias!


El comportamiento que está viendo se debe directamente al hecho de que el servidor de autorización OAuth2 siempre descarta su propia caducidad cuando lo configura en la notificación GrantResourceOwnerCredentials (las demás notificaciones de Grant* también se ven afectadas): https://github.com/jchannon/ katanaproject / blob / master / src / Microsoft.Owin.Security.OAuth / OAuthAuthorizationServerHandler.cs # L386

Una OAuthAuthorizationServerOptions.AccessTokenProvider es establecer la fecha de caducidad en AuthenticationTokenProvider.CreateAsync (la clase que utiliza para OAuthAuthorizationServerOptions.AccessTokenProvider ):

Simplemente configure context.Ticket.Properties.ExpiresUtc con la fecha de caducidad que elija, y debería funcionar como se ha previsto:

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

También puede echar un vistazo a AspNet.Security.OpenIdConnect.Server , una bifurcación del servidor de autorización OAuth2 ofrecido por OWIN / Katana que admite de forma nativa la configuración de la fecha de caducidad de GrantResourceOwnerCredentials : https://github.com/aspnet-contrib/AspNet .Security.OpenIdConnect.Server / tree / dev


Puede configurarlo en el método TokenEndPoint lugar del método GrantResourceOwnerCredentials . Por favor vea mi respuesta a una pregunta similar aquí .

Espero que ayude.


Tenemos una situación similar, con diferentes clientes que tienen diferentes tiempos de espera de tokens, por lo que queríamos poder establecer la caducidad en consecuencia. En el AuthenticationTokenProvider que implementamos, estábamos configurando la caducidad, pero se sobrescribía cuando se estaba firmando el token.

La solución con la que terminamos contentos fue anular el método TokenEndpoint. Entonces podemos implementar una expiración específica del cliente:

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

* Editado para resolver una condición de carrera.


Voy a arrojar esto aquí, a partir de ahora, hay una manera más simple sin crear una nueva clase, solo está configurando opciones:

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() { ... AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30), .. };