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

Visual studio code DefaultAzureCredential:使用VisualStudio代码凭据禁止图形访问,visual-studio-code,azure-functions,microsoft-graph-api,access-token,defaultazurecredential,Visual Studio Code,Azure Functions,Microsoft Graph Api,Access Token,Defaultazurecredential,我正在尝试从Azure函数中的ms graph读取用户属性。 对于身份验证,我使用Azure.Identity中的DefaultAzureCredential类 使用本地共享令牌缓存凭据和Azure中的托管身份凭据进行访问没有问题! 我想使用Visual Studio代码凭据,但在调用graph API时收到“Authorization\u RequestDenied!特权不足,无法完成操作”错误消息 问题似乎是我使用VS代码凭据收到的访问令牌。用户帐户与我与共享令牌缓存凭据使用的帐户相同 有什

我正在尝试从Azure函数中的ms graph读取用户属性。 对于身份验证,我使用Azure.Identity中的DefaultAzureCredential类

使用本地共享令牌缓存凭据和Azure中的托管身份凭据进行访问没有问题! 我想使用Visual Studio代码凭据,但在调用graph API时收到“Authorization\u RequestDenied!特权不足,无法完成操作”错误消息

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

有什么想法吗?多谢各位

代码:

例外情况: “代码:授权\u请求被拒绝\r\n消息:权限不足,无法完成操作。\r\n内部错误:\r\n\t附加数据:\r\n\t日期:2021-04-20T08:02:23\r\n\t请求id:…\r\n\t客户端请求id:…\r\n客户端请求id:…\r\n”


检查VS代码返回的令牌后,它似乎缺少所需的委托权限/作用域。 文件称,列出用户需要其中一项:

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

由于VS代码正在使用的服务主体不需要任何这些,因此它将无法工作。 在尝试显式获取具有所需范围的令牌之后,它似乎也不起作用

因此,VS代码凭证目前似乎无法用于此目的。
您将需要一个不同的凭据,或者可能将客户端机密/证书凭据用于您自己的应用程序注册。

您可以在以下位置检查令牌:例如?从那里确保令牌包含它应该包含的所有内容,比如“scp”声明应该包含所需的作用域。我是基于令牌的身份验证新手,所以我不确定令牌应该包含什么。scp标记包含“email Mail.ReadWrite Mail.Send openid profile Tasks.ReadWrite”。问题是我需要在Azure或类似的东西中注册VS代码吗?看起来它可能缺少所需的作用域。问题在于VS Code正在使用的服务主体(其应用程序注册)不需要这样做。这是在本地使用这些凭据的一般问题:\n您可能需要尝试其他凭据类型或使用客户端凭据身份验证(机密/证书)。真遗憾。但是谢谢你的帮助。我想你也可以试试
https://graph.microsoft.com/User.Read.All
作为作用域而不是.default。不过,这可能会导致错误:\n感谢您的广泛帮助。对于本地调试,共享令牌缓存凭据可用作替代方案。很遗憾,Visual Studio凭据不起作用。
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