2015-11-13 4 views
8

Ich versuche, eine Token-Ablaufzeit dynamisch festzulegen, aber es scheint, dass es standardmäßig auf 20 Minuten beschränkt bleibt.OAuth2 WebApi Token Ablauf

Hier ist meine 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); 

} 

Hier meine GrantResourceOwnerCredentials Methode ist:

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

Und hier ist Methode mein SetProperties, wo ich den Ablauf Einstellung kann:

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

Selbst Danach kehrt das Token zurück:

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

Irgendwelche Ideen, warum ich nicht den Ablauf festlegen kann, wo ich gerade bin? Dieser Server wird eine Vielzahl von verschiedenen Clients mit unterschiedlichen Ablaufzeiten verwenden, daher dachte ich, dass dies der richtige Ort ist. Gibt es woanders, wo ich das machen sollte? Vielen Dank!

Antwort

5

Das Verhalten Sie sehen direkt durch die Tatsache der Autorisierungsserver OAuth2 verursacht wird immer verwirft Ihren eigenen Ablauf, wenn Sie es in der GrantResourceOwnerCredentials Benachrichtigung (die anderen Grant* Benachrichtigungen werden ebenfalls betroffen) gesetzt: https://github.com/jchannon/katanaproject/blob/master/src/Microsoft.Owin.Security.OAuth/OAuthAuthorizationServerHandler.cs#L386

Eine Arbeit um ist das Ablaufdatum in AuthenticationTokenProvider.CreateAsync (die Klasse verwenden Sie für OAuthAuthorizationServerOptions.AccessTokenProvider) einzustellen:

einfach context.Ticket.Properties.ExpiresUtc mit dem Ablaufdatum Ihrer Wahl festgelegt, und es sollte als intented arbeiten:

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

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

Sie können auch einen Blick auf AspNet.Security.OpenIdConnect.Server, eine Gabel des Servers durch OWIN/Katana angeboten OAuth2 Berechtigung nehmen, die nativ das Ablaufdatum von GrantResourceOwnerCredentials unterstützt Einstellung: https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/dev

+0

Vielen Dank! – user3726393

+0

@Pinpoint Aber warum "verwirft der OAuth2-Autorisierungsserver immer Ihren eigenen Ablauf, wenn Sie ihn in den GrantResourceOwnerCredentials festlegen"? –

+0

Wahrscheinlich ein Fehler (es wäre nicht der erste, und da diese Komponente nicht mehr gewartet wird, gibt es keine Korrektur) – Pinpoint

2

Sie können es in der TokenEndPoint Methode anstelle von GrantResourceOwnerCredentials Methode. Bitte sehen Sie meine Antwort auf eine ähnliche Frage here.

Ich hoffe es hilft.

1

Ich werde dies hier werfen, ab jetzt gibt es einfacheren Weg, um eine neue Klasse ohne die Erstellung, es ist nur Optionen einstellen:

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

Erti-Chris Eelmaa, auf diese Weise setzen Sie einen General Timeout für alle Token. Die Frage ist, es dynamisch zu setzen. – jumuro

10

Wir haben eine ähnliche Situation, mit verschiedenen Kunden, die haben verschiedene Token Timeouts, also wollten wir den Ablauf entsprechend einstellen können. Im AuthenticationTokenProvider, den wir implementiert haben, haben wir den Ablauf festgelegt, aber er wurde von dem Zeitpunkt überschrieben, an dem der Token signiert wurde.

Die Lösung, mit der wir zufrieden waren, war die TokenEndpoint-Methode. Wir sind dann in der Lage, einen kundenspezifischen Ablauf zu implementieren:

* Bearbeitet, um eine Race-Bedingung zu lösen.

+0

vielen Dank @Michael –

+1

Ich glaube nicht, dass das sicher ist. 'context.Optionen' werden unter Anfragen geteilt. Sie werden "AccessTokenExpireTimeSpan" für parallel laufende Anfragen überschreiben. – user3608068

+0

Danke @ user3608068, ich habe die Antwort entsprechend aktualisiert! – Michael

Verwandte Themen