ASP.NET WebAPI Срок действия RefreshTokenProvider неверен - PullRequest
0 голосов
/ 07 апреля 2019

Потратив несколько очень хороших часов на решение этой проблемы, я решил обратиться за помощью - возможно, кто-то знает, где я делаю что-то не так.

Прежде всего, у меня 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 находятся в последней версии.

Спасибо.

...