- 调用Parent -> GetChild,返回“401 - 您无权查看此目录或页面”
不使用 Client ids/Secrets/Keys/etc,就像我想的那样
托管身份的背后是将所有这些都扔到窗外,给定
以上所有,父母应该可以打电话给孩子吗?如果是这样,什么
我是不是设置错了?
我注意到当前设置有两点。
1.使用托管身份获取令牌以从“父”调用“子”服务端点
托管身份仅为您的应用服务提供身份(无需管理/维护应用机密或密钥)。然后,此身份可用于获取不同 Azure 资源的令牌。
但您的应用仍有责任使用此身份并获取相关资源的令牌。在这种情况下,相关资源将是您的“子”API。我想这可能是你现在缺少的部分。
Microsoft Docs 上的相关文档 - How to use managed identities for App Service and Azure Functions > Obtain tokens for Azure resources
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault;
// ...
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net");
// change this to use identifierUri for your child app service.
// I have used the default value but in case you've used a different value, find it by going to Azure AD applications > your app registration > manifest
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://<yourchildappservice>.azurewebsites.net");
此 C#/.NET 示例使用 Microsoft.Azure.Services.AppAuthentication nuget 包并获取 Azure Key Vault 的令牌。在您的情况下,您将用您的“子”服务的 identifierUri 替换 https://vault.azure.net。它通常默认设置为https://<yourappservicename>.azurewebsites.net,但您可以通过转到 Azure AD 应用程序然后找到相关的应用注册 > 清单来找到它的值。您还可以将 applicationId 用于目标应用程序(即“Child”)来获取令牌。
如果您不使用 C#/.NET,上面相同的 Microsoft Docs 链接还提供了有关如何使用托管标识和 基于 REST 的调用获取令牌的指南任何平台。 Using REST Protocol
这是一篇博文,也提供了很好的介绍 - Call Azure AD protected website using Managed Service Identity (MSI)
2。 Azure RBAC 角色分配不同于您可能想要使用的 Azure AD 角色
我看到您已从 IAM 将参与者角色分配给父应用服务的身份。此角色分配适用于 Azure RBAC,并有助于授予管理资源的权限,但 Azure AD 角色声明的工作方式不同。
如果您要做的是为父应用分配一个角色,可以在子应用中进行检查,然后才允许调用,则有另一种设置方式。
我首先要提到的是,这种基于角色的设置是针对一些高级场景的,并不是必须要做的。按照上述第 1 点中的步骤操作后,您应该可以从“父母”调用“儿童”服务。
现在,一旦从父级到子级的调用开始工作,您可能希望将对子级应用服务的访问限制为仅“父级”或少数有效应用程序。以下是实现这一目标的两种方法。
这两种方法都在此处的 Microsoft Docs 中进行了解释 - Microsoft identity platform and the OAuth 2.0 client credentials flow
关联 SO 帖子和博客
方法 1 - 使用访问控制列表
当您的“子”API 收到令牌时,它可以解码该令牌并从 appid 和 iss 声明中提取客户端的应用程序 ID。然后它将应用程序与它维护的访问控制列表 (ACL) 进行比较。
根据您的要求,API 可能仅向特定客户端授予完整权限的子集或所有权限。
方法 2 - 使用应用程序权限或角色
配置您的子 API 应用程序以公开一组应用程序权限(或角色)。
这种方法更具声明性,因为您定义了一个应用程序权限,该权限需要分配给任何可以调用您的child-api 的应用程序。
导航到 Azure Active Directory > 应用注册 > child-api 应用的应用注册 > 清单
添加一个新的应用程序角色.. 像这样使用 json:
"appRoles": [
{
"allowedMemberTypes": [
"Application"
],
"displayName": "Can invoke my API",
"id": "fc803414-3c61-4ebc-a5e5-cd1675c14bbb",
"isEnabled": true,
"description": "Apps that have this role have the ability to invoke my child API",
"value": "MyAPIValidClient"
}]
将应用权限分配给您的前端应用
New-AzureADServiceAppRoleAssignment -ObjectId <parentApp.ObjectId> -PrincipalId <parentApp.ObjectId> -Id "fc803414-3c61-4ebc-a5e5-cd1675c14bbb" -ResourceId <childApp.ObjectId>
现在,在您的子 api 收到的身份验证令牌中,您可以检查角色声明集合是否必须包含名为“MyAPIValidClient”的角色,否则您可以拒绝未授权异常的调用。