【发布时间】:2021-07-14 10:07:40
【问题描述】:
我正在尝试从 Azure 函数内的 ms 图中读取用户属性。 对于身份验证,我使用了 Azure.Identity 中的 DefaultAzureCredential 类。
使用本地共享令牌缓存凭据和 Azure 中的托管身份凭据进行访问是不可能的! 我想使用 Visual Studio Code Credential,但在调用图形 API 时收到“Authorization_RequestDenied!权限不足,无法完成操作”错误消息。
问题似乎是我通过 VS Code 凭据收到的访问令牌。用户帐户与我用于共享令牌缓存凭据的用户帐户相同。
有什么想法吗?谢谢。
代码:
DefaultAzureCredentialOptions options = new DefaultAzureCredentialOptions();
options.VisualStudioCodeTenantId = Environment.GetEnvironmentVariable("Debug_VisualStudioCodeTenantId");
var credential = new DefaultAzureCredential(options);
token = credential.GetToken(
new Azure.Core.TokenRequestContext(
new[] { "https://graph.microsoft.com/.default" }));
accessToken = token.Token;
var graphServiceClient = new GraphServiceClient(
new DelegateAuthenticationProvider((requestMessage) =>
{
requestMessage
.Headers
.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
return Task.CompletedTask;
}));
var users = await graphServiceClient.Users.Request().GetAsync(); // throw the forbidden exception
例外: "代码:Authorization_RequestDenied\r\n消息:权限不足,无法完成操作。\r\n内部错误:\r\n\tAdditionalData:\r\n\t日期:2021-04-20T08:02:23\r\n\ trequest-id: ...\r\n\tclient-request-id: ...\r\nClientRequestId: ...\r\n"
【问题讨论】:
-
你能在例如检查令牌吗? jwt.ms?从那里确保令牌包含它应该包含的所有内容,例如“scp”声明应该包含所需的范围。
-
我是基于令牌的身份验证的新手,所以我不确定令牌应该包含什么。 scp 标签包含“email Mail.ReadWrite Mail.Send openid profile Tasks.ReadWrite”。问题可能是我需要在 Azure 中注册 VS 代码或类似的东西吗?
-
看起来它可能缺少所需的范围。问题是 VS Code 正在使用的服务主体(其应用程序注册)不需要这样做。这是在本地使用这些凭据的一般问题:\ 您可能需要尝试不同的凭据类型或使用客户端凭据身份验证(秘密/证书)。
-
真可惜。不过谢谢你的帮助。
-
我猜你也可以尝试
https://graph.microsoft.com/User.Read.All作为范围而不是.default。不过,这可能会以错误告终:\
标签: visual-studio-code azure-functions microsoft-graph-api access-token defaultazurecredential