Потратив несколько очень хороших часов на решение этой проблемы, я решил обратиться за помощью - возможно, кто-то знает, где я делаю что-то не так.
Прежде всего, у меня ASPПроект .NET WebAPI (.NET 4.7.2), настроенный с помощью BearerAuthentication:
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new CustomerOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
RefreshTokenProvider = new AuthenticationTokenProvider()
{
OnCreate = (obj) =>
{
obj.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddMonths(6);
obj.SetToken(obj.SerializeTicket());
},
OnReceive = (obj) => { obj.DeserializeTicket(obj.Token); }
},
};
Все работает нормально, кроме потока токенов обновления;поток выглядит следующим образом:
1) Выдать токен аутентификации с коротким сроком действия вместе с токеном Refresh: сделать POST-запрос к / токену с именем пользователя, паролем и grant_type: 'password'
;ответ возвращается очень приятно:
{
"access_token": "UN8tE3iJWlIjGX1eTbOEc2nX7qaZ2ACvor...",
"token_type": "bearer",
"expires_in": 1799,
"refresh_token": "fb84E_OqK334Z1t00WrOAm6phYTA63dLye96eE8NF4NV...",
"userName": "XXXX",
".issued": "Sat, 06 Apr 2019 21:14:39 GMT",
".expires": "Sat, 06 Apr 2019 21:44:39 GMT"
}
2) Замените токен обновления на более длинный токен аутентификации: сделайте POST-запрос к той же конечной точке / токену с 'grant_type': 'refresh_token'
и 'refresh_token':'fb84E_OqK334Z1t00WrOAm6phYTA63dLye96eE8NF4NV...'
и удивите -ответ, который я получаю, имеет тот же срок действия:
{
"access_token": "EwOXPrGOzV9nU_...",
"token_type": "bearer",
"expires_in": 1799,
"refresh_token": "gsPVze9u2auwMZXspFY...",
"userName": "XXX",
".issued": "Sat, 06 Apr 2019 21:20:11 GMT",
".expires": "Sat, 06 Apr 2019 21:50:11 GMT"
}
Я хотел бы подчеркнуть, что я пробовал также иметь собственную реализацию AuthenticationTokenProvider
, но все равно не повезло.
При выполнениинемного отладки (и теперь я говорю также о моей пользовательской реализации AuthenticationTokenProvider), что я заметил, что везде время истечения было правильным, и context.Ticket.Properties.Dictionary
всегда имел правильные значения, кроме одного места (это от моегопользовательская реализация OAuthAuthorizationServerProvider
):
public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
{
context.AdditionalResponseParameters.Add(property.Key, property.Value);
}
return Task.FromResult<object>(null);
}
Здесь время истечения было тем, которое отображалось в полученном JSON.Ты хоть представляешь, что не так?
Все пакеты nuget находятся в последней версии.
Спасибо.