DefaultAzureCredential:使用 VisualStudio 代码凭据禁止图形访问

DefaultAzureCredential: Graph access forbidden with VisualStudio Code Credential

我正在尝试从 Azure 函数内的 ms 图表读取用户属性。 对于身份验证,我使用了来自 Azure.Identity.

的 DefaultAzureCredential class

在本地使用共享令牌缓存凭据和在 Azure 中使用托管身份凭据进行访问是没有问题的! 我想使用 Visual Studio Code Credential,但是当我调用图 API.

时收到“Authorization_RequestDenied!权限不足,无法完成操作”的错误消息

问题似乎是我通过 VS 代码凭据收到的访问令牌。用户帐户与我用于共享令牌缓存凭据的帐户相同。

有什么想法吗?谢谢。

代码:

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

Exception: "Code: Authorization_RequestDenied\r\nMessage: Insufficient privileges to complete the operation.\r\nInner error:\r\n\tAdditionalData:\r\n\tdate: 2021-04-20T08:02:23\r\n\trequest-id: ...\r\n\tclient-request-id: ...\r\nClientRequestId: ...\r\n"

检查 VS Code 返回的令牌后,似乎缺少必需的委托 permission/scope。 文档说列出用户需要其中之一:

User.ReadBasic.All, User.Read.All, User.ReadWrite.All, Directory.Read.All, Directory.ReadWrite.All, Directory.AccessAsUser.All

由于 VS Code 使用的服务主体不需要任何这些,因此它不会工作。 在尝试明确获取具有所需范围的令牌后,它似乎也不起作用。

因此 VS Code 凭证目前似乎不适用于此目的。 您将需要不同的凭据,或者在您自己的应用程序注册中使用客户端 secret/certificate 凭据。