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 权限添加到它自己。所以我像这样生成访问令牌:
我正在尝试为机器设置客户端凭据身份验证(原始问题: 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 权限添加到它自己。所以我像这样生成访问令牌: