我的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应用程序。我已经读过这不是问题。我已经在线跟踪了许多教程和官方文档,主要是the official Graph authorization doc,我仍然无法弄清楚我做错了什么。非常感谢任何帮助,谢谢。
答案 0 :(得分:4)
我使用fiddler来调试请求,我发现了完整的错误消息:用户或管理员未同意使用该应用程序。我用Google搜索了这个消息,发现了一些堆栈文章和github问题线程,这些线程引导我找到解决方案:我的请求在基本URL中使用" common",作为实际我需要的租户ID使用我通过此answer on stack获得的Azure租户ID。我的身份验证请求的新基本URL现在如下所示:
https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/authorize
其中" xxxx -.... xxx"将由您的Azure租户ID替换!
答案 1 :(得分:0)
如果您不使用客户端密钥,则需要配置租户以支持隐式授权流程。您可以按照this博客文章中的说明执行/验证配置。这需要使用Azure管理门户下载,修改应用清单并上传它。
或者,可能更好的策略是将代码切换为使用converged v2.0 authentication endpoints。它允许使用new app registration portal管理您的应用程序,并且很好地支持隐式流和动态范围。您可以找到有关实际身份验证流程here的更多信息。它与您现在所做的相差甚远,只需要进行一些小的调整。
如果您在此之后仍有问题,请再次联系。小提琴/网络跟踪将非常有用。此外,异常中的详细消息也非常有用。