gpt4 book ai didi

c# - Microsoft Graph token 不包含任何权限,或者无法理解权限

转载 作者:行者123 更新时间:2023-11-30 15:52:30 27 4
gpt4 key购买 nike

我正在使用 Microsoft Graph 并创建了一个应用程序来读取来自特定用户的邮件。

但是,在获取访问 token 并尝试读取邮件文件夹后,我收到了 401 Unauthorized 答复。详细消息是:

token 不包含任何权限,或者无法理解权限

这似乎是一个非常明确的信息,但不幸的是我找不到解决方案。这是我到目前为止所做的:

权限是: enter image description here enter image description here - 编写以下代码以获取访问 token :

 // client_secret retrieved from secure storage (e.g. Key Vault)
string tenant_id = "xxxx.onmicrosoft.com";
ConfidentialClientApplication client = new ConfidentialClientApplication(
"..",
$"https://login.microsoftonline.com/{tenant_id}/",
"https://dummy.example.com", // Not used, can be any valid URI
new ClientCredential(".."),
null, // Not used for pure client credentials
new TokenCache());
   string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
AuthenticationResult result = client.AcquireTokenForClientAsync(scopes).Result;
string token = result.AccessToken;

到目前为止一切顺利。我确实得到了一个 token 。

现在我想阅读邮件文件夹:

url = "https://graph.microsoft.com/v1.0/users/{username}/mailFolders";
handler = (HttpWebRequest)WebRequest.Create(url);
handler.Method = "GET";
handler.ContentType = "application/json";
handler.Headers.Add("Authorization", "Bearer " + token);
response = (HttpWebResponse)handler.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
returnValue = sr.ReadToEnd();
}

这次我收到一条 401 消息,详细信息:

token 不包含任何权限,或者无法理解权限。

我在互联网上搜索过,但找不到我的 token 没有权限的原因。

感谢您的宝贵时间!

更新 1

如果我使用 Graph Explorer 读取邮件文件夹,那么它工作正常。此外:如果我从浏览器中获取 token ID,然后在我的第二段代码中使用它,那么我也会得到一个结果。所以,问题实际上是我从第一步收到的 token 。

最佳答案

为确保这按您预期的方式工作,您应该明确说明您希望为哪个租户获取访问 token 。 (在这个租户中,应用程序当然应该已经获得管理员同意。)

使用特定于租户的端点,而不是“通用” token 端点:

string url = "https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token";

(其中 {tenant-id} 是租户的租户 ID(Guid)或任何经过验证的域名。)

我还强烈建议您反对自己构建 token 请求,正如您在问题中所展示的那样。这可能对教育目的有用,但从长远来看往往不安全且容易出错。

您可以使用各种库来代替。下面是一个使用 Microsoft Authentication Library (MSAL) for .NET 的示例:

// client_secret retrieved from secure storage (e.g. Key Vault)
string tenant_id = "contoso.onmicrosoft.com";
ConfidentialClientApplication client = new ConfidentialClientApplication(
client_id,
$"https://login.microsoftonline.com/{tenant_id}/",
"https://dummy.example.com", // Not used, can be any valid URI
new ClientCredential(client_secret),
null, // Not used for pure client credentials
new TokenCache());

string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
AuthenticationResult result = client.AcquireTokenForClientAsync(scopes).Result
string token = result.AccessToken;
// ... use token

关于c# - Microsoft Graph token 不包含任何权限,或者无法理解权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54235129/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com