AADSTS500011,在azure身份验证中插入作用域返回错误

mnemlml8  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(176)

我目前正在尝试验证使用msal python生成的访问令牌。
我像这样创建了我的ConfidentialClientApplication

app = ConfidentialClientApplication(
    "<client_id>", #client id
    authority="https://login.microsoftonline.com/<tenant_iD>",
    client_credential="<client_secret>",
    token_cache=cache)

然后我尝试像这样创建我的访问令牌

result = app.acquire_token_for_client(scopes=["<scope>/.default"])

该作用域已在Azure门户上的“Expose an API”下为资源公开,并已由客户端添加到“API权限”下。
如果我不包括作用域名称,则可以很好地生成令牌。
然而,我看了其他的例子,我注意到有些人把他们的作用域和作用域名称一起使用
例如:API://<application_uri>/USER.READ,而不是像api://这样的应用程序URI<application_uri>
当我在作用域中使用API://<application_uri>/USER.READ时,我得到了这个错误

{'error': 'invalid_resource', 'error_description': 'AADSTS500011: The resource principal named api://<application_uri>/USER.READWRITE was not found in the tenant named <tenant name>. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You might have sent your authentication request to the wrong tenant.\r\nTrace ID: 64697571-81b1-4d6c-bd61-fa69c7c97700\r\nCorrelation ID: 3bbc9c0f-39d1-4ca3-b15e-918a10391924\r\nTimestamp: 2023-05-02 07:30:44Z', 'error_codes': [500011], 'timestamp': '2023-05-02 07:30:44Z', 'trace_id': '64697571-81b1-4d6c-bd61-fa69c7c97700', 'correlation_id': '3bbc9c0f-39d1-4ca3-b15e-918a10391924', 'error_uri': 'https://login.microsoftonline.com/error?code=500011'}
cache <msal.token_cache.SerializableTokenCache object at 0x000001946C97FFD0>

我一直在寻找答案几个星期了,有人可以帮助吗?

mlmc2os5

mlmc2os51#

注意客户端凭证流需要应用程序API权限。授权码流程等用户交互流程传递委托API权限。

在使用客户端凭据流时,您必须使用/.default,或者在使用v1端点时使用api://ClientID
错误**AADSTS500011**通常发生在您传递无效资源时,如下所示:

resource: api://ClientID/user.read

我创建了一个Azure AD应用程序,并添加了API权限,如下所示:

当暴露API完成并添加范围时,它被视为委托的API权限。
现在,我使用以下参数生成了access token

https://login.microsoftonline.com/TenantID/oauth2/token

client_id:ClientID
client_secret:ClientSecret
resource:api://ID
grant_type:client_credentials

当我解码令牌时,aud是**api://xxx**,但范围没有显示,因为委托的API权限已在客户端凭据流中传递:

因此,**要解决此问题,**请创建如下应用角色:

将App角色添加到API权限刀片中,如下图所示:

我在Postman中通过Client Credential流程生成了access token

resource: api://ClientID

当我解码令牌时,app角色成功显示如下:

  • 我使用授权代码流生成了访问令牌,如下所示:
https://login.microsoftonline.com/TenantID/oauth2/token

client_id:ClientID
grant_type:authorization_code
scope:api://xxx/User.Read
code:code
redirect_uri:https://jwt.ms
client_secret:ClientSecret

我解码令牌时,委托范围显示成功,如下图:

参考:

MSAL Python 1.22.0 documentation (msal-python.readthedocs.io)

相关问题