Как сделать долгоживущие токены с токенами Katana OAuth Bearer

Из шаблона SPA мне удалось заставить работать основные потоки OAuth.

    OAuthOptions = new OAuthAuthorizationServerOptions
    {
        AllowInsecureHttp = true, 
        ApplicationCanDisplayErrors = true,
        TokenEndpointPath = new Microsoft.Owin.PathString("/Token"),
        AuthorizeEndpointPath = new Microsoft.Owin.PathString("/api/Account/ExternalLogin"),
        Provider = new CompositeWebroleOauthProvider<User>(PublicClientId, IdentityManagerFactory, CookieOptions)
    };

У меня есть одностраничное приложение, размещенное в отдельном домене, которое будет взаимодействовать с webapi, используя токены носителя из конечной точки токена.

Я выполняю поток ResourceOwnerCredentials с запросом со следующими данными:

 data: {
        grant_type: "password",
        username: username,
        password: password
       }

Эти токены недолговечны и т. д. Теперь я хотел бы расширить свое приложение, чтобы я мог получить токен refress или что-то такое, что мне не нужно все время аутентифицировать. Каковы мои следующие шаги?

Реализация GrantResourceOwnerCredentials:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    using (var identityManager = _identityManagerFactory.Create())
    {
        var user = await identityManager.FindAsync(context.UserName, context.Password);

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

        ClaimsIdentity oAuthIdentity = await identityManager.CreateIdentityAsync(user, context.Options.AuthenticationType);
        AuthenticationProperties properties = CreatePropertiesAsync(user);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);

    }
}

person Poul K. Sørensen    schedule 16.10.2013    source источник
comment
В строке свойства AuthenticationProperties = CreatePropertiesAsync(user); как выглядит ваш метод CreatePropertiesAsync?   -  person Cameron Woodall    schedule 08.10.2014
comment
Некоторое время назад я не знал, где припарковался код. Но моя работа заключалась в том, что было опубликовано здесь: blogs.msdn.com/b/webdev/archive/2013/09/20/, который также использует его.   -  person Poul K. Sørensen    schedule 08.10.2014


Ответы (1)


Мне просто нужно было настроить провайдера для генерации токенов обновления.

Любые комментарии для указателей на то, когда устанавливать токены обновления, а когда нет, были бы хороши.

 RefreshTokenProvider = new AuthenticationTokenProvider
 {
     OnCreate = CreateRefreshToken,
     OnReceive = ReceiveRefreshToken,
 }


    private void CreateRefreshToken(AuthenticationTokenCreateContext context)
    {
        context.SetToken(context.SerializeTicket());
    }

    private void ReceiveRefreshToken(AuthenticationTokenReceiveContext context)
    {
        context.DeserializeTicket(context.Token);
    }
person Poul K. Sørensen    schedule 16.10.2013
comment
В основном RefreshToken помогает приложению получить новый AccessToken даже после истечения срока действия текущего AccessToken. При получении нового AccessToken может быть представлен RefreshToken и не требует ввода имени пользователя и пароля. Время жизни RefreshToken может управляться поставщиком токенов, и пользователю должна быть предоставлена ​​возможность предоставить время жизни RefreshToken. - person jd4u; 17.10.2013
comment
Это имеет смысл, спасибо. Просто нужно выяснить, как это сделать в Katana AuthorizationServer (Owin). Кажется, токены обновления имеют тот же срок службы, что и токены доступа. - person Poul K. Sørensen; 17.10.2013
comment
Да, токен обновления создается из того же билета, что и билет accessToken. Мы можем изменить его с помощью ServerOptions, предоставленных при запуске, как вы отметили выше. - person jd4u; 17.10.2013
comment
Но это означает, что мы меняем и токен обновления, и токен доступа. Разве я не хотел бы, чтобы токен доступа имел 20 минут и токен обновления, пока не будет отозван? - person Poul K. Sørensen; 17.10.2013
comment
Для accessToken вы можете передать AccessTokenExpireTimeSpan. Да, вы можете сохранить токен обновления с более длительным периодом времени. - person jd4u; 17.10.2013
comment
Спасибо за ваши ответы здесь и в другом вопросе с тем же. stackoverflow.com/questions/19409085/ - person Poul K. Sørensen; 17.10.2013