Azure AD OAuth2访问令牌请求错误-400错误请求

本文关键字:请求 错误 -400 访问令牌 AD OAuth2 Azure | 更新日期: 2023-09-27 17:59:06

我的WPF桌面应用程序(C#)正试图通过Microsoft Graph API读取用户的Outlook电子邮件。我被困在身份验证过程中;我已经收到了一个身份验证代码,现在我正试图从Azure获取访问令牌,但在发送访问令牌:请求时,一直收到HTTP 400错误代码

/**** Auth Code Retrieval ****/
string authCodeUrl = "https://login.microsoftonline.com/common/oauth2/authorize";
authCodeUrl += "?client_id" = clientId;
authCodeUrl += "&redirect_uri=" + redirectUri;
authCodeUrl += "&response_type=code";
authCodeUrl += "&resource=https%3A%2F%2Fgraph.microsoft.com%2F";
Process.start(authUrl); // User logs in, we get the auth code after login
string code = "......"; // Hidden for this post
/**** Access Token Retrieval ****/
string tokenUrl = "https://login.microsoftonline.com/common/oauth2/token"
string content = "grant_type=authorization_code";
content += "&client_id=" + clientId;
content += "&resource=https%3A%2F%2Fgraph.microsoft.com%2F";
content += "&code=" + code;
content += "&redirect_uri=" + redirectUri;
WebRequest request = WebRequest.Create(tokenUrl);
request.ContentType = "application/x-www-form-urlencoded";
byte[] data = Encoding.UTF8.GetBytes(content);
request.ContentLength = data.Length;
request.Method = "POST";
try 
{
  using (Stream stream = request.GetRequestStream())
  {
    stream.Write(data, 0, data.Length);
  }
  WebResponse response = request.GetResponse(); // This throws exception
}
catch (Exception error) // This catches the exception
{
  Console.WriteLine(error.Message); // Outputs 400, bad request
}

以上是用于检索身份验证代码的代码,然后是检索访问令牌的尝试。我们没有client_secret,因为机密仅用于Web应用程序,而这是一个本地桌面WPF应用程序。我读到这不是问题。我在网上学习了很多教程和官方文档,主要是官方的Graph授权文档,但我仍然不知道自己做错了什么。如有任何帮助,我们将不胜感激,谢谢。

Azure AD OAuth2访问令牌请求错误-400错误请求

我使用fiddler调试请求,发现完整的错误消息:用户或管理员未同意使用该应用程序。我在谷歌上搜索了这条消息,发现了一些堆栈文章和github问题线程,这些文章和线程引导我找到了解决方案:我的请求一直在使用基本URL中的"common"作为租户ID,而实际上我需要使用我通过堆栈上的这个答案获得的Azure租户ID。我的身份验证请求的新基本URL现在看起来像:

https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/authorize 

其中"xxxx-xxx"将被您的Azure租户id替换!

如果不使用客户端机密,则需要将租户配置为支持隐式授予流。您可以按照本博客文章中的说明执行/验证配置。这需要使用Azure管理门户下载、修改应用程序清单并上传。

或者,也可能是更好的策略,是将代码切换到使用聚合v2.0身份验证端点。它允许使用新的应用程序注册门户管理您的应用程序,并很好地支持隐式流和动态范围。您可以在此处找到有关实际身份验证流的更多信息。它离你现在所做的不远,只需要一些小的调整。

如果在此之后您仍有问题,请再次联系。小提琴手/网络追踪会非常有帮助。此外,异常中的详细消息也将非常有用。