Я пытаюсь разрешить доступ к учетным записям 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);
}
}