代码之家  ›  专栏  ›  技术社区  ›  Ronald Wildenberg

授予服务主体对其他租户中的应用程序的访问权限

  •  2
  • Ronald Wildenberg  · 技术社区  · 6 年前

    我在一个租户中有一个Azure广告服务负责人( OneTenant )我想允许访问另一个租户中的应用程序( OtherTenant

    租户中的服务主体 单色 是Azure逻辑应用程序的托管服务标识。所以我真正想要的是从我的逻辑应用程序中调用一个API。此API受中的Azure AD应用程序保护 .

    应用于 其他承租人 在中定义许多角色和服务主体 单色

    我尝试了以下方法:

    • 将应用程序设置为 其他承租人
    • 运行以下PS命令尝试将SP添加到应用程序中的角色:

      New-AzureADServiceAppRoleAssignment `
        -ObjectId <object-id-of-sp-in-one-tenant> `
        -Id <role-id> `
        -PrincipalId <object-id-of-sp-in-one-tenant> `
        -ResourceId <app-id-in-other-tenant>
      

      (都已登录) 单色 其他承租人

      这给出了一个错误,即 app-id-in-other-tenant object-id-of-sp-in-one-tenant 找不到,取决于我登录的位置。

    我还尝试在中创建服务主体 单色 其他承租人 在这种情况下,我会收到一条错误消息: Authenticating principal does not have permission to instantiate multi-tenantapplications and there is not matching Applicationin the request tenant.

    2 回复  |  直到 6 年前
        1
  •  5
  •   Rohit Saigal    6 年前

    从你的问题中接受命令:

    New-AzureADServiceAppRoleAssignment `
      -ObjectId <object-id-of-sp-in-one-tenant> `
      -Id <role-id> `
      -PrincipalId <object-id-of-sp-in-one-tenant> `
      -ResourceId <app-id-in-other-tenant>
    

    现在你通过了 <app-id-in-other-tenant>

    换成 <object-id-of-API-in-other-tenant>

        2
  •  5
  •   Ronald Wildenberg    6 年前

    solution 由Rohit Saigal works提出。它确实指向正确的方向,但并不完整。

    第一步是 OneTenant 表示中的应用程序 OtherTenant . 所以在登录到 单色 ,运行以下脚本:

    $spInOneTenant = New-AzureADServicePrincipal -AppId <app-id-in-other-tenant>
    

    New-AzureADServiceAppRoleAssignment

    New-AzureADServiceAppRoleAssignment `
        -Id <role-id> `
        -ObjectId <object-id-of-sp-in-one-tenant> `
        -PrincipalId <object-id-of-sp-in-one-tenant> `
        -ResourceId $spInOneTenant.ObjectId
    

    诀窍是使用您在上一步中创建的服务主体的对象id作为 ResourceId .

        3
  •  0
  •   1iveowl Diego Sanchez    4 年前

    这里提出的问题/答案很有帮助,但我花了一些时间来研究细节,并实际使其发挥作用,因此请允许我对上述问题进行更多阐述,因为这可能也会对其他人有所帮助。

    脚本

    两个租户:

    • Home Tenant .
    • Other Tenant .

    一个Azure应用程序服务 API app ,访问权限由 .

    Logic app 在订阅中放置 其他承租人 需要安全地访问 API应用程序 房客 .

    对于 application 注册于 home tenant s Azure Active Directory。这个 应用 已注册为多租户应用程序。

    您还需要创建应用程序角色(请参阅文档: How to: Add app roles in your application and receive them in the token read.weather .

    的配置 其他承租人 Logic App

    逻辑应用程序 API应用程序

    1. 启用 系统已分配 用户身份 logic app -即使用 Managed Identity . 记下系统分配的托管标识 Object ID {18a…} ),你马上就需要了。

    2. 应用 其他承租人 使用此命令,其中 appId 应用 注册于 {1a3} 此处):

    New-AzureADServicePrincipal -AppId {appId}

    这个命令将输出一个json文档,其中包括 objectId 对于刚刚创建的服务主体。

    [... more json ...]
    "objectId": "b08{…}",
    [... more json...]
    

    您还应该看到appRoles,包括app角色 您刚刚创建了 New-AzureADServicePrincipal

    [... more json...]
      "appRoles": [
        {
          "allowedMemberTypes": [
            "Application"
          ],
          "description": "Read the weather.",
          "displayName": "Read Weather",
          "id": "46f{…}",
          "isEnabled": true,
          "value": "read.weather"
        }
      ],
    [... more json...]
    
    1. 要将其全部绑定在一起,请使用以下命令进行应用程序角色分配:

    New-AzureADServiceAppRoleAssignment -Id {app role ide} -ObjectId {system assigned identity object id} -PrincipalId {system assigned identity object id} -ResourceId {object id of service principal}

    例如,类似这样的事情:

    New-AzureADServiceAppRoleAssignment -Id 46f… -ObjectId 18a… -PrincipalId 18a… -ResourceId b08…

    1. 现在我们已经准备好在 逻辑应用程序 将URI用于 使用托管标识进行身份验证。

    api://{appId}

    Logic App configuration

    这是否意味着任何人都可以这样做,只要他们知道你的申请 应用 注册,这会不会影响 API应用程序 ?

    是的,确实如此,而且它确实可能会危及到国家的安全

    如果您查看从 逻辑应用程序 它是有效的访问令牌,包含所有必需的声明,包括应用程序角色。然而,访问令牌是由 其他承租人 而不是 房客 .

    因此,如果您有一个多租户的应用程序,并且您想保护它不受这种情况的影响,那么您可以检查发行者( tid 更可能的情况是)传入的访问令牌调用API,并且仅当颁发者是 房客 应用 单一租户应用程序。

    或者,您可以要求发行者匹配API信任的租户列表。