Getting Azure Error: IDW10203: The 'scope' or 'scp' claim does not contain scopes 'access_as_machine' or was not found

Getting Azure Error: IDW10203: The 'scope' or 'scp' claim does not contain scopes 'access_as_machine' or was not found

我正在尝试为机器设置客户端凭据身份验证(原始问题: Web API with Microsoft Identity Platform Authentication)

我正在从 https://login.microsoftonline.com/xxx/oauth2/v2.0/token 获得有效令牌。

但是,我在尝试调用控制器的安全操作时收到以下错误消息:

IDW10203: The 'scope' or 'scp' claim does not contain scopes 'access_as_machine' or was not found. 

这是我的控制器操作的样子:

[Authorize]
[HttpGet("GetAsMachine")]
[RequiredScope("access_as_machine")]
public string GetAsMachine() => $"Machine {Assembly.GetExecutingAssembly().GetName().Version}";

在客户端凭据中,我必须将范围设置为“api://xxx/.default”。 当我尝试将其设置为实际范围时,出现此错误:

1002012: The provided value for scope api://xxx/access_as_machine is not valid. Client credential flows must have a scope value with /.default suffixed to the resource identifier (application ID URI).

知道我在这里遗漏了什么吗?

请注意一件事,当您想使用客户端凭证流时,这意味着令牌将包含 roles 声明,但不包含委托访问令牌的 scp 声明(由授权代码生成 flow/ropc流..).

那么当你想对客户端凭证流生成的token进行认证时,可以按照this document.

简而言之,例如我新建了一个.net 5 MVC项目,并在appsettigns.json中添加配置:

  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "clientid_which_have_api_permission",
    "Domain": "tenantname.onmicrosoft.com",
    "TenantId": "common",
    "Audience": "clientid_of_the_app_exposed_api"//e.g: api://client_id
  }

然后在Startup.cs中,在ConfigureServices方法中添加services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd");,在Configure方法中添加app.UseAuthentication();

然后在我的控制器中,我添加这样的操作:

[Authorize(Roles = "Tiny.TestRead")]
public string getData() {
     //HttpContext.ValidateAppRole("Tiny.TestRead");
     return "success";
}

然后我想你会注意到我使用 Tiny.TestRead 作为目标角色名称。这是在 Azure 广告中定义的,它要求您 expose an api with a role。并且不要忘记添加 api 权限。

在我的测试中,我只创建了 1 个 azure 广告应用程序,这个应用程序公开了一个 api(角色类型),然后我将这个 api 权限添加到它自己。所以我像这样生成访问令牌: