Несколько сроков жизни токена в WebAPI2 с идентификатором asp.net

Я использую поставщика удостоверений asp.net с промежуточным программным обеспечением OWIN с OAuth в своем приложении WebAPI. С помощью шаблона и

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

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

Например, мой 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 дней. Это возможно?


person thebringking    schedule 25.04.2014    source источник


Ответы (2)


Я смог исправить это, вставив следующее в моего провайдера 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);

    }
person thebringking    schedule 25.04.2014
comment
Спасибо за обновление вашего вопроса с ответом. Я буду делать что-то подобное в ближайшем будущем, и ваш ответ на вопрос будет очень кстати. - person Chuck Conway; 26.04.2014
comment
Нет проблем, я буду держать его открытым в течение дня или около того, если у кого-то есть лучшее решение, тогда я отмечу его ответом. - person thebringking; 26.04.2014
comment
context.Options — это ссылка на OAuthAuthorizationServerOptions в вашем OAuth configuration. Итак, когда вы меняете параметры в GrantResourceOwnerCredentials, это означает, что вы меняете AccessTokenExpireTimeSpan глобально. Поэтому я предпочитаю ответы Дичена как лучшие ответы. - person Hung Doan; 08.12.2015

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

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

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

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

    ...
}
person dichen    schedule 30.10.2015