2015-11-13 5 views
8

Я пытаюсь установить время истечения срока годности динамически, но похоже, что он просто продолжает дефолт до 20 минут.OAuth2 Срок действия токена WebApi

Вот мой 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); 

} 

Вот мой метод 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); 
    } 

А вот мой SetProperties метод, где я могу установки истечения срока действия:

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

Даже после этого маркер возвращается:

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

Любые идеи, почему я не могу установить истечение, где я сейчас? Этот сервер будет принимать разные клиенты с разными сроками истечения срока, поэтому я решил, что это место для этого. Есть ли где-то еще, что я должен делать это? Благодаря!

ответ

5

поведение вы видите непосредственно вызвано тем фактом, что сервер авторизации OAuth2 всегда отбрасывает свой EXPIRATION, когда вы установите его в GrantResourceOwnerCredentials уведомлении (другие Grant* уведомления также влияет): https://github.com/jchannon/katanaproject/blob/master/src/Microsoft.Owin.Security.OAuth/OAuthAuthorizationServerHandler.cs#L386

произведение вокруг, чтобы установить дату истечения в AuthenticationTokenProvider.CreateAsync (класс, который используется для OAuthAuthorizationServerOptions.AccessTokenProvider):

Просто установить context.Ticket.Properties.ExpiresUtc с даты истечения срока действия вашего выбора, и он должен работать как intented:

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

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

Вы также можете посмотреть на AspNet.Security.OpenIdConnect.Server, вилка сервера авторизации oauth2, предлагаемый Owin/Катана, которая изначально поддерживает настройки даты истечения из GrantResourceOwnerCredentials: https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/dev

+0

Большое вам спасибо! – user3726393

+0

@Pinpoint Но почему «сервер авторизации OAuth2 всегда отбрасывает свое собственное истечение, когда вы устанавливаете его в GrantResourceOwnerCredentials»? –

+0

Вероятно, ошибка (она не будет первой, и поскольку этот компонент больше не поддерживается, нет исправления) – Pinpoint

2

Вы можете установить его в методе TokenEndPoint вместо метода GrantResourceOwnerCredentials. См. Мой ответ на аналогичный вопрос here.

Надеюсь, это поможет.

1

я брошу это здесь, так как прямо сейчас, есть более простой способ, не создавая новый класс, это просто настройка параметров:

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

Erti-Chris Eelmaa, таким образом вы устанавливаете общий таймаут для всех токенов. Вопрос заключается в том, чтобы установить его динамически. – jumuro

10

Мы имеем аналогичную ситуацию, с различными клиентами, которые имеют разные тайм-ауты токенов, поэтому мы хотели иметь возможность установить истечение соответственно. В AuthenticationTokenProvider, который мы реализовали, мы установили истечение срока действия, но оно было перезаписано к моменту подписания токена.

Решение, в котором мы оказались счастливы, переопределяло метод TokenEndpoint. Затем мы можем реализовать истечение срока действия клиента:

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

* Отредактировано для разрешения проблемы гонки.

+0

спасибо большое @Michael –

+1

Я не думаю, что это безопасно. 'context.Options' разделяется между запросами. Вы будете перезаписывать 'AccessTokenExpireTimeSpan' для параллельных запросов. – user3608068

+0

Спасибо @ user3608068, я обновил ответ соответственно! – Michael

Смежные вопросы