Проблема с Microsoft Graph с кодом авторизации - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь разрешить доступ к учетным записям Microsoft, используя приведенные здесь инструкции. https://docs.microsoft.com/en-us/graph/auth-v2-user.

У меня работают первые два шага, проблема возникает, когда я пытаюсь использовать код авторизации, которыйвозвращается после того, как пользователь предоставил разрешение приложению.

Я немного запутался, потому что в приведенном выше примере Ответ авторизации имеет код авторизации, который выглядит как GUID с дополнительным символом в начале.Из примера: M0ab92efe-b6fd-df08-87dc-2c6500a7f84d.Это похоже на то, что я получаю.

Однако на третьем шаге, получив токен, код авторизации теперь выглядит совсем иначе.Снова из примера: OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr... Я предполагаю, что это какой-то Base64 string, но я попытался просто кодировать GUID подобный код из предыдущего шага, но это не сработало.

Мне не хватает шага, который каким-то образом превращает исходный код авторизации в новый формат?

Если я использую код авторизации, который я получаю напрямую, я получаю ответ 401 при попытке получитьТокен доступа.

Соответствующий код ниже (c # и ASP.NET core 2.1).

Запрошенные разрешения:

"User.Read Mail.ReadWrite"

Ссылка на запрос авторизации:

$"https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={appId}" +
   $"&response_type=code" +
   $"&redirect_uri={responseUrl}" +
   $"&response_mode=query" +
   $"&scope={permissions}" +
   $"&state={userManager.GetUserId(User)}";

Действие для получения ответа на авторизацию:

[HttpGet]
[Route("authentication/ms/receive-response/")]
public async Task<IActionResult> ReceiveAuthResponse(string code, string state)
{
    ApplicationUser applicationUser = await UserManager.GetApplicationUser(User);

    OfficeLinkConfiguration officeLinkConfiguration = new OfficeLinkConfiguration
    {
        ApplicationId = configuration.GetSection("OfficeLink").GetValue<string>("ApplicationId"),
        RequestedPermissions = configuration.GetSection("OfficeLink").GetValue<string>("RequestedPermissions"),
        RedirectUrl = configuration.GetSection("OfficeLink").GetValue<string>("ResponseUrl"),
        ClientSecret = configuration.GetSection("OfficeLink").GetValue<string>("Password"),
    };

    OfficeLinkProvider officeLinkProvider = new OfficeLinkProvider(officeLinkConfiguration, tokenStore);

    await officeLinkProvider.RequestAccessToken(applicationUser, code);

    return Redirect("/");
}

Запрос токена доступа:

public async Task RequestAccessToken(ApplicationUser user, string authorisationCode)
{
    string tokenUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/token";

    string postBody = $"client_id={Configuration.ApplicationId}" +
                      $"&scope={Configuration.RequestedPermissions}" +
                      $"&code={authorisationCode}" +
                      $"&redirect_uri={Configuration.RedirectUrl}" +
                      "&grant_type=authorization_code" +
                      $"&client_secret={Configuration.ClientSecret}";

    using (WebClient webClient = new WebClient())
    {
        webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";

        string result = await webClient.UploadStringTaskAsync(tokenUrl, postBody);

        TokenResponse tokenResponse = JsonConvert.DeserializeObject<TokenResponse>(result);

        HandleAuthorisationResponse(user, tokenResponse);
    }

}

1 Ответ

0 голосов
/ 03 декабря 2018

Мне удалось это исправить, удалив существующий пароль приложения (секретный) и создав новый.

...