2014-04-25 5 views
3

Я использую провайдера Identity asp.net с промежуточным программным обеспечением OWIN с OAuth в своем приложении WebAPI. Используя шаблон иМногократные времена жизни Token в WebAPI2 с идентификатором asp.net

https://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples

Я работает OAuth на моих WebAPI конечных точек. Однако я не вижу, как расширить эту архитектуру, чтобы обеспечить различные сроки жизни Token для разных запросов.

Например, мой REST API будет использоваться веб-приложением и мобильным приложением. Я хочу, чтобы мобильное приложение получало гораздо больше времени на токен, чем веб-приложение.

В моем Startup.Auth.cs файл я вижу следующего OAuth Конфигурация-

 // Enable the application to use bearer tokens to authenticate users 
     app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new ApplicationOAuthProvider<ApplicationUserManager, DirectoryUser, Guid>(PublicClientId), 
      AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AllowInsecureHttp = true 
     }); 

Есть ли способ, чтобы изменить это поведение каждого запроса токена? Например, я мог бы выставить «/ Token» -> 14 дней и «/ DeviceToken» -> 60 дней. Это возможно?

ответ

7

я был в состоянии исправить это мой вставив следующий код в мой OAuth провайдер (ApplicationOAuthProvider.cs) от

ственного образца
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var userManager = context.OwinContext.Get<TUserManager>(); 

     TUser user = await userManager.FindAsync(context.UserName, context.Password); 


     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 


     //if user, expire 60. If Admin, 14 days 
     if (userManager.IsInRole(user.Id, "Users")) 
     { 
      context.Options.AccessTokenExpireTimeSpan = TimeSpan.FromDays(60); 
     } 
     else { 
      context.Options.AccessTokenExpireTimeSpan = TimeSpan.FromDays(14); 
     } 

     ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user, 
context.Options.AuthenticationType); 
     ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user, 
      CookieAuthenticationDefaults.AuthenticationType); 
     AuthenticationProperties properties = CreateProperties(user.UserName); 


     AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 
     context.Validated(ticket); 
     context.Request.Context.Authentication.SignIn(cookiesIdentity); 

    } 
+0

Спасибо за то, что вы обновили свой вопрос с ответом. Я буду делать что-то подобное в ближайшем будущем, и ваш вопрос ответ будет очень кстати. –

+0

Нет проблем, я буду держать его открытым на день или около того, если у кого-то есть лучшее решение, тогда я отмечу его ответом – thebringking

+0

Sweet. Тот же вопрос. Ответил ... спасибо! –

1

Настройки context.Options.AccessTokenExpireTimeSpan будет на самом деле изменить глобальное значение и влияю на все запросы, которые не будут работать для первоначального требования.

Правильное место - метод TokenEndpoint.

public override Task TokenEndpoint(OAuthTokenEndpointContext context) 
{ 
    ... 

    if (isRequestFromDevice) 
    { 
     context.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(60); 
    } 

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