我有一个场景,在使用EasyAuth之前有几个APIM实例。每个APIM实例都有一个托管标识,该身份是组的成员。我正在寻找一种方法来限制API中对这个特定组的访问(或者至少是APIM的特定ObjectID )。
不编写代码(或使用IP限制)是否支持此方案?
我尝试过设置“用户分配所需的?”在我的AD应用程序( API和Azure函数)中,可以使用“将Azure应用程序限制为一组用户”的指导:https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-restrict-your-app-to-a-set-of-users#update-the-app-to-enable-user-assignment。但是,我仍然可以从具有托管标识的APIM访问API,即使它没有在API中得到适当的分配。我原以为这个电话会以401失败。
发布于 2020-03-21 16:53:10
首先,您观察到了一种工作行为,因为您(a)显式地为托管标识分配了角色/访问easy应用程序注册;或者(b) APIM有一个缓存的令牌,从您启用轻松auth应用注册所需的显式分配之前开始。
一般来说,你的方法是正确的。但有一个警告。基于组的授权将不适用于任何服务主体(今天)。这意味着,如果您将一个服务主体(A)放入一个组(G),并将这个组分配给另一个服务主体(B)。第一个服务主体(A)仍然无法获得服务主体(B)的访问令牌。今天的任何服务主体(A)必须明确授权给另一个服务主体(B)。意思--如果设置为要求为服务主体指定显式用户分配,则必须显式分配任何其他要授予访问权限的服务主体。其他任何东西在获取访问令牌时都将失败。
下面是在干净的环境中实现所需的步骤:
在函数应用程序上指定任何角色之前的结果:
HTTP 500 ERROR:
AADSTS501051: Application 'xxx'(easy-apim) is not assigned to a role for the application 'yyy'(easyprotected-fn)详细错误:
Getting Managed Service Identity token for xxx-xxx-xxx audience threw exception 'System.InvalidOperationException:
Authentication failed for Active Directory Tenant: 'https://login.windows.net/yyy-aaa-bbb'
---> Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException:
AADSTS501051: Application 'yyy'(easy-apim) is not assigned to a role for the application 'bb'(easyprotected-fn).现在,要让托管标识通过,您必须为您的服务主体创建一个应用程序角色(受保护的API --您将其更改为显式要求用户分配的API)。遵循指南这里并为允许的成员类型选择“应用程序”。例如:
{
"allowedMemberTypes": [
"Application"
],
"displayName": "GrantAccessToAPIM",
"id": "aaaaaa-bbbb-cccc-dddd-feb89e6f5d47",
"isEnabled": true,
"description": "Used to explicitly gelegate access for APIM",
"value": "GrantAccessToAPIM"
}然后,您需要显式地将您的托管标识分配给这个角色!您可以通过使用新-AzureADServiceAppRoleAssignment cmdlet来实现这一点。
一旦将托管标识分配给受保护的应用程序,您将在APIM中看到成功调用:
身份验证-管理-标识(1.244毫秒)
{
"message": "Obtaining managed identity token using clientId:xxx AAD Authority:https://login.windows.net/yyy for https://fndemo-test.azurewebsites.net audience succeeded.",
"errorResponse": null
}https://stackoverflow.com/questions/60777419
复制相似问题