Web Api 2 HTTP 400 Bad Request при обновлении токена носителя Oauth - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь реализовать refresh_token. Мой сценарий, когда истекает access_token, я вызываю refresh_token, чтобы дать мне новый access_token, но я получаю эту ошибку:

{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.HttpConnection+HttpConnectionResponseContent,

Headers: {

Cache-Control: no-cache

Pragma: no-cache

Server: Microsoft-IIS/8.5 X-Powered-By: ASP.NET Date: Wed, 08 Apr 2020 17:11:41 GMT Content-Length: 25 Content-Type: application/json; charset=UTF-8 Expires: -1 }
}

В моем сценарии, когда я получаю 401 Not Authorized, я вызываю метод refresh_token и передаю refresh_token, который является правильным , Это мой код при отправке запроса:

HttpContent requestContent = new StringContent("grant_type=refresh_token&refresh_token=" + refresh_token, Encoding.UTF8, "application/x-www-form-urlencoded");
HttpResponseMessage responseMessage = await client.PostAsync("Token", requestContent); <--- HERE get BadRequest 400.

Я создал простой refresh_token с продолжительностью один месяц. Вот класс:

public class SimpleRefreshTokenProvider : IAuthenticationTokenProvider
{
private static ConcurrentDictionary<string, AuthenticationTicket> _refreshTokens = new ConcurrentDictionary<string, AuthenticationTicket>();

public async Task CreateAsync(AuthenticationTokenCreateContext context)
{
var guid = Guid.NewGuid().ToString();

// maybe only create a handle the first time, then re-use for same client
// copy properties and set the desired lifetime of refresh token
var refreshTokenProperties = new AuthenticationProperties(context.Ticket.Properties.Dictionary)
{
IssuedUtc = context.Ticket.Properties.IssuedUtc,
ExpiresUtc = DateTime.UtcNow.AddMonths(1)
};
var refreshTokenTicket = new AuthenticationTicket(context.Ticket.Identity, refreshTokenProperties);

//_refreshTokens.TryAdd(guid, context.Ticket);
_refreshTokens.TryAdd(guid, refreshTokenTicket);

// consider storing only the hash of the handle
context.SetToken(guid);
}

public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
AuthenticationTicket ticket;
if (_refreshTokens.TryRemove(context.Token, out ticket))
{
context.SetTicket(ticket);
}
}

public void Create(AuthenticationTokenCreateContext context)
{
throw new NotImplementedException();
}

public void Receive(AuthenticationTokenReceiveContext context)
{
throw new NotImplementedException();
}
}
}

Дурион токена доступа составляет 1 день. И в Startup.Auth.cs:

OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new FirebirdAuthorizationServerProvider(PublicClientId),
//AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
// In production mode set AllowInsecureHttp = false
AllowInsecureHttp = true,
//RefreshTokenProvider
RefreshTokenProvider = new SimpleRefreshTokenProvider(),

};

Пожалуйста, помогите, я не знаю, в чем должна быть проблема? Модели Access_token генерируются нормально, когда пользователь входит в систему. В модели доступа Token я получил access_token и refresh_token, и все в порядке. Я отправляю запрос на авторизацию.

ОБНОВЛЕНИЕ 1: После тестирования с запросом почтальона / токеном сначала вызовите access_token и refresh_token и получите модель токена. После этого позвоните / Token с refresh_token и дайте мне новые access_token и refresh_token. Я копирую токен new_refre sh. Закройте WEB API и запустите снова. При повторном запуске и добавлении / TOKEN скопированный refresh_token я получаю

{
"error": "invalid_grant"
}
...