我正在尝试按照https://docs.microsoft.com/en-us/graph/auth-v2-user此处的说明允许访问Microsoft帐户。
我可以执行前两个步骤,当我尝试使用在用户授予应用程序权限后返回的授权码时,就会出现此问题。
我有点困惑,因为在上面的示例中,授权响应的授权码看起来像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);
}
}
答案 0 :(得分:0)
我能够通过删除现有的应用程序密码(秘密)并创建一个新的密码来解决此问题。