Невозможно использовать токен обновления с ядром ASP.NET с использованием MS Oauth2

Ответов: 0

Невозможно использовать токен обновления с ядром ASP.NET с использованием MS Oauth2

Я рассмотрел множество вопросов, но пока не решил проблему. Для аутентификации включен Microsoft.AspNetCore.Authentication.MicrosoftAccount . Аутентификация и авторизация работают хорошо. Кажется неудобным, что библиотека будет автоматизировать все, кроме обновления токена.

Для обновления токена offline_accessвключено:

app.UseMicrosoftAccountAuthentication(new MicrosoftAccountOptions
{
    ClientId = Startup.Config["Data:MSAppId"],
    ClientSecret = Startup.Config["Data:MSAppSecret"],
    CallbackPath = new PathString("/signin-microsoft-token"),
    AuthorizationEndpoint = MicrosoftAccountDefaults.AuthorizationEndpoint,
    SignInScheme = new IdentityCookieOptions().ExternalCookieAuthenticationScheme,
    TokenEndpoint = MicrosoftAccountDefaults.TokenEndpoint,
    Scope = { "openid", "email", "profile", "offline_access", "Contacts.Read", "Mail.ReadWrite", "Mail.Send" },
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    SaveTokens = true
});

Значки сохраняются в AspNetUserTokensтаблице.
Таблица AspNetUserTokens

Использование токена доступа, контакты и электронные письма успешно возвращены, и письма успешно отправляются от имени пользователя. Однако при попытке использовать токен обновления возвращается ошибка «Bad Request» [400].

string clientId = /* ... */
string clientSecret = /* ... */
string access_token = /* ... */
string refresh_token = /* ... */
DateTime expiration_date = /* ... */

const string refreshTokenUrl = "https://login.microsoftonline.com/common/oauth2/token";
const string redirectUri = "http://localhost/";

if (DateTime.Now < (expiration_date - TimeSpan.FromMinutes(10)))
    return access_token;

HttpClient client = new HttpClient();
string parameters = $"grant_type=refresh_token&refresh_token={ WebUtility.UrlEncode(refresh_token) }&client_id={ WebUtility.UrlEncode(clientId) }&client_secret={ WebUtility.UrlEncode(clientSecret) }&redirect_uri={ WebUtility.UrlEncode(redirectUri) }";
var contentBody = new StringContent(parameters, System.Text.Encoding.UTF8, "application/x-www-form-urlencoded");
HttpResponseMessage response = await client.PostAsync(refreshTokenUrl, contentBody);
if (!response.IsSuccessStatusCode)
{
    // process 400 - bad request error ...
}

Я посмотрел запрос с помощью скрипача, и он кажется правильным. Я использовал аналогичный код выше с чистым решением REST и не испытывал затруднений.

Я бы подумал, что у их библиотеки будет лучшее решение для обновления токена, так как он работает без особых усилий для первоначальной аутентификации и авторизации. Есть ли лучший способ решить эту проблему? Если нет, то почему запрос отклоняется?

РЕДАКТИРОВАТЬ:

Удаление redirect_uriрезультата привело к тому же ответу на ошибку. Глядя глубже на скрипач, тело ответа об ошибке (JSON) начинается со следующего:

{
  "error":"invalid_grant",
  "error_description":"AADSTS70000: Transmission data parser failure: Refresh Token is malformed or invalid.
  Trace ID: 92beaa67-97f9-48c3-8281-87da228b0000
  // next is Correlation ID, Timestamp, trace_id, etc

Однако я уверен, что весь refresh_token правильно сохранен и отправлен, и последний тест имел 953 символа.

03C #, asp.net-жильный, OAuth-2,0, освежают-маркер,
Похожие вопросы