授权图Microsoft Graph问题

时间:2018-11-29 03:58:33

标签: asp.net-core oauth-2.0 microsoft-graph

我正在尝试按照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);
    }

}

1 个答案:

答案 0 :(得分:0)

我能够通过删除现有的应用程序密码(秘密)并创建一个新的密码来解决此问题。