切换到客户端密钥时出现 Microsoft Graph 身份验证问题:范围无效

Ago*_*noX 0 c# microsoft-graph-sdks microsoft-graph-api

我的第一个 Microsoft Graph 应用程序旨在下载服务邮箱的电子邮件附件,使用了DeviceCodeCredential身份验证类,如以下代码所示:

var credentials = new DeviceCodeCredential(        
      (info, cancel) => { Console.WriteLine(info.Message); return Task.FromResult(0); },
      "12345678-1234-1234-1234-12345678" /*TenantId*/,
      "99999999-9999-9999-9999-999999999999" /*ClientID*/
      );
Run Code Online (Sandbox Code Playgroud)

我们向建造者提供了凭证GraphServiceClient;这工作得很好,也就是说我们可以枚举邮箱中的项目并下载附件(不包括这些操作的代码,因为它与问题无关)。

var graphServiceClient = new GraphServiceClient(
                             credentials, 
                             new string [] {"Mail.Read", "Mail.ReadBasic", "Mail.ReadWrite"});
Run Code Online (Sandbox Code Playgroud)

然后我们切换到客户端秘密身份验证;我们为该应用程序生成了一个客户端密钥,并将凭证对象更改为ClentSecretCredential使用以下代码的对象:

var credentials = new ClientSecretCredential("12345678-1234-1234-1234-12345678" /*TenantId*/, 
                                             "99999999-9999-9999-9999-999999999999" /*ClientID*/,
                                             "SOME8SECRET123GENERATEDBYAZURE" /*Client Secret*/);
Run Code Online (Sandbox Code Playgroud)

现在,当我们调用同一个GraphServiceClient构造函数时,我们会得到异常:

Azure.Identity.AuthenticationFailedException:ClientSecretCredential 身份验证失败:AADSTS1002012:为范围 Mail.Read Mail.ReadBasic Mail.ReadWrite 提供的值无效。客户端凭据流必须具有一个范围值,其后缀为 /.default 后缀为资源标识符(应用程序 ID URI)。

似乎需要进行更多更改才能从身份验证模式切换到另一个身份验证模式。但到底是什么?

sco*_*ang 5

scopes对于客户端凭证流, in的值GraphServiceClient应该是https://graph.microsoft.com/.default

请参阅客户端凭证流程的文档

范围 描述
范围 在此请求中为范围参数传递的值应该是所需资源的资源标识符(应用程序 ID URI),并附加 .default 后缀。对于 Microsoft Graph 示例,该值为https://graph.microsoft.com/.default。此值告诉 Microsoft 标识平台,在您为应用程序配置的所有直接应用程序权限中,终结点应为与您要使用的资源关联的权限颁发令牌。要了解有关 /.default 范围的更多信息,请参阅同意文档