在后端应用程序注册上启用用户/分配时,Azure 用户模拟不起作用

问题描述 投票:0回答:1

我有两个应用程序注册:一个用于后端,一个用于前端。

在后端 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

azure azure-active-directory impersonation azure-application-registration
1个回答
0
投票

请注意,客户端凭据流程具有以下权限

Application
类型。此流程不适用于
User_impersonation
,因为它是 委托 权限。

我在我的 Azure AD 租户中注册了 2 个应用程序,与您相同:一个用于后端,一个用于前端。

Backend应用程序上,我定义(公开)

User_impersonation
范围,如下所示:

enter image description here

Frontend 应用程序上,我添加了

User_impersonation
API 权限:

enter image description here

现在,我使用 客户端凭据 生成了访问令牌,代码如下:

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)

回复:

enter image description here

当我通过将令牌粘贴到 jwt.ms 来解码令牌时,它在 aud

 中有正确的 
audience 但缺少
scp
声明,如下所示:

enter image description here

要在两个应用程序注册表上启用组分配时使

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

代码:

enter image description here

我运行了下面的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)

回复:

enter image description here

当我通过将令牌粘贴到 jwt.ms 来解码令牌时,它在 aud

 中具有正确的 
audiencescp
 中的 
User_impersonation
权限,如下所示:

enter image description here

在您的情况下,解码令牌是否具有 scp

 声明中的 
User_impersonation 权限,并更改为 委托 流以生成令牌以访问后端,正如我提到的。

© www.soinside.com 2019 - 2024. All rights reserved.