如何明确授予用户管理身份对 AAD 应用程序注册的访问权限?

How to explicitly grant access from a User Managed Identity to a AAD application registration?

我们有一个用户管理的标识,Service Fabric 集群使用该标识对部署到集群的服务中的各种资源进行身份验证。其中一个用例是向我们也拥有并使用 AAD 应用程序注册保护的 API 请求访问令牌,使用以下代码片段,其中 ResourceId 参数是 AAD 应用程序注册客户端 ID:

        AppAuthenticationResult tokenResult;

        try
        {
            tokenResult = await this.azureServiceTokenProvider.GetAuthenticationResultAsync(resourceId).ConfigureAwait(false);
        }

这工作正常,但是我们最近需要通过在关联的企业应用程序上打开需要用户分配 属性 来禁用访客对 AAD 应用程序注册的访问。这样做会导致上述令牌请求失败并出现异常:

Tried to get token using Managed Service Identity. Access token could not be acquired. Received a non-retryable error. MSI ResponseCode: BadRequest, Response: {"error":"invalid_grant","error_description":"AADSTS501051Application '<Managed Identity Client ID GUID>'() is not assigned to a role for the application '<AAD Application Registration Client ID GUID>' 

我们已经仔细阅读了文档,但似乎无法找到如何从托管标识向 AAD 应用程序分配应用程序角色。这是如何实现的?

在您的网站中 API expose App roles 如此处所述。

使用 this blog 中的说明将此应用角色分配给您的托管身份。

现在您已经 configured an application to require user assignment,您需要为 AAD 应用程序注册分配用户托管标识。

This part不适用于你的场景,因为你的不是用户,而是用户管理的身份(应用)。

因此您需要create an app role在您的 AAD 应用程序注册中 Application 类型。

然后 grant an appRoleAssignment to a service principal(您的用户管理身份)使用 Microsoft Graph API。

POST https://graph.microsoft.com/v1.0/servicePrincipals/{id}/appRoleAssignedTo
Content-Type: application/json
Content-Length: 110

{
  "principalId": "principalId-value",
  "resourceId": "resourceId-value",
  "appRoleId": "appRoleId-value"
}

我的 .

中的详细步骤