我有两个应用程序注册:一个用于后端,一个用于前端。
在后端 App Reg 上,我定义(公开)了一个名为
User_impersonation
的范围,如下所示:
在前端 App Reg 上,我添加了如下权限(User_impersonation):
同样在前端,我启用了用户/组分配并分配了安全组;这样只有该安全组的成员才能访问/查询该前端。
到目前为止,当用户使用访问令牌查询前端时(从前端应用程序注册表请求);一切正常:前端应用程序注册表从后端请求访问令牌并转发用户的请求。
但是,当我尝试在后端应用程序注册表上启用用户/组分配时(通过添加相同的安全组);前端应用程序无法再查询后端(User_impersonation 失败);就像查询超时而后端没有回复一样。
当在两个应用程序注册表(不仅仅是前端)上启用组分配时,有人可以帮助我使 User_impersonation 工作吗?谢谢。
这就是客户端/用户请求访问 Web 应用程序/前端的方式:
from azure.identity import DefaultAzureCredential, ClientSecretCredential
authority="https://login.microsoftonline.com/{TENANT_ID}/v2.0"
credential = DefaultAzureCredential(authority=authority, exclude_shared_token_cache_credential=True)
scope = "api://{frontend_clientid}/.default"
minerva_webapp_access_token = credential.get_token(scope).token
这就是 Web 应用程序/前端请求访问后端应用程序注册表的方式:
credential = ClientSecretCredential(
tenant_id=TENANT_ID,
client_id=WEBAPP_CLIENT_ID,
client_secret=webapp_client_secret)
scope = ( "api://{minerva_python39_backend_app_client_id}/.default".format(
minerva_python39_backend_app_client_id=MINERVA_PYTHON39_CLIENTID))
access_token = credential.get_token(scope).token
请注意,客户端凭据流程仅具有以下权限
类型。此流程不适用于Application
,因为它是 委托 权限。User_impersonation
我在我的 Azure AD 租户中注册了 2 个应用程序,与您相同:一个用于后端,一个用于前端。
在Backend应用程序上,我定义(公开)
User_impersonation
范围,如下所示:
在 Frontend 应用程序上,我添加了
User_impersonation
API 权限:
现在,我使用 客户端凭据 生成了访问令牌,代码如下:
credential = ClientSecretCredential(
tenant_id=TENANT_ID,
client_id=WEBAPP_CLIENT_ID,
client_secret=webapp_client_secret)
scope = ( "api://{minerva_python39_backend_app_client_id}/.default".format(
minerva_python39_backend_app_client_id=MINERVA_PYTHON39_CLIENTID))
access_token = credential.get_token(scope).token
print(access_token)
回复:
当我通过将令牌粘贴到 jwt.ms 来解码令牌时,它在 aud
中有正确的audience 但缺少
scp
声明,如下所示:
要在两个应用程序注册表上启用组分配时使
发挥作用,您的访问令牌应具有具有该特定权限的User_impersonation
声明。scp
为此,您需要使用授权码等委托流程 流程、交互流程、用户名密码流程等...用于生成令牌。
就我而言,我使用授权代码流程来生成需要代码的访问令牌。我在浏览器中运行了以下授权请求,并在地址栏中成功获取了code:
https://login.microsoftonline.com/<tenantId>/oauth2/v2.0/authorize?
client_id=<frontend_appId>
&redirect_uri=https://jwt.ms
&response_type=code
&response_mode=query
&scope= api://<backend_appID>/User_impersonation
&state=12345
代码:
我运行了下面的Python代码,并使用响应中的授权代码流获得了访问令牌,如下所示:
from azure.identity import AuthorizationCodeCredential
credential = AuthorizationCodeCredential(
tenant_id=TENANT_ID,
client_id=WEBAPP_CLIENT_ID,
authorization_code="<auth_code_from_above>",
redirect_uri="https://jwt.ms",
)
scope = ( "api://{minerva_python39_backend_app_client_id}/.default".format(
minerva_python39_backend_app_client_id=MINERVA_PYTHON39_CLIENTID))
access_token = credential.get_token(scope).token
print(access_token)
回复:
当我通过将令牌粘贴到 jwt.ms 来解码令牌时,它在 aud
中具有正确的audience 和
scp
中的User_impersonation 权限,如下所示:
在您的情况下,解码令牌是否具有 scp
声明中的User_impersonation 权限,并更改为 委托 流以生成令牌以访问后端,正如我提到的。