authentication - 使用客户端 ID 和客户端密码调用由 AAD 保护的 azure 函数
问题描述
我有一个受 Azure Active Directory 保护的 Azure 函数。
如果我已登录,我可以从浏览器成功调用应用程序。
现在,我想做的是从不使用用户名和密码的应用程序调用该函数来进行身份验证,而是使用受信任的应用程序客户端 ID 和客户端密码。
为此,我尝试使用为保护功能应用程序而创建的相同应用程序(例如ApplicationA )。我去了 App Registrations,找到了通过在 Function App 身份验证/授权设置 ( ApplicationA ) 中配置 Azure Active Directory 身份验证提供程序创建的应用程序,并为它设置了一个客户端密码。
现在,我可以使用所述应用程序客户端 ID 和生成的密钥获取令牌。
但是当我尝试使用该令牌调用函数时,我收到 401 错误。
我在 App Registration 中对新创建的应用程序(比如ApplicationB)尝试了相同的操作,但结果相同,我仍然得到 401。
我什至尝试在 Subscriptions 中为该应用程序添加一个 Reader Role,但随后再次出现 - 使用令牌调用 Function 时出现 401。
我知道,应用程序设置中有类似 API 权限的东西。所以我尝试将 ApplicationB 的权限添加到ApplicationA user_impersonation但它也不起作用,所以这不是方法。
那么,如何授予已注册应用程序的权限,我可以为其获取令牌,以便我可以使用此令牌调用函数?
编辑:
我正在使用以下代码获取令牌:
using Microsoft.Identity.Client;
string ClientId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
string ClientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
string TenantId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
string Authority = $"https://login.microsoftonline.com/{TenantId}";
string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(ClientId)
.WithClientSecret(ClientSecret)
.WithAuthority(new Uri(Authority))
.Build();
AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync();
string token = result.AccessToken;
解决方案
您需要通过清单将至少一个应用程序权限(具有允许的成员类型应用程序的 appRole)注册到函数应用程序注册中。然后您可以将应用程序权限分配给客户端应用程序。
您可以查看我的文章以获取有关定义权限的更多信息:https ://joonasw.net/view/defining-permissions-and-roles-in-aad
清单中的示例应用权限:
"appRoles": [
{
"allowedMemberTypes": [
"Application"
],
"description": "Allow the application to read all things as itself.",
"displayName": "Read all things",
"id": "32028ccd-3212-4f39-3212-beabd6787d81",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "Things.Read.All"
}
],
您需要自己定义 id,它只需要是一个 GUID。这value
是在roles
声明中的令牌中发送的内容。描述和显示名称仅用于权限在 UI 中的显示方式。
推荐阅读
- ios - 从 iOS 中的文本视图中删除单行
- python - Scrapy 加载不会将所有信息加载到 postgres 中。为什么?
- python - 在两个字符串之间拆分正则表达式 python,但包含使用 re.split 并返回一个列表
- python - 在 Keras 中训练 GAN 时,是否需要多次通过来优化生成器和判别器?
- android - 将kotlin数据类转换为json字符串
- javascript - 从 expo-video-player 获取“setAudioModeAsync 错误”
- python-3.x - 根据公共列上的匹配值合并 2 个 CSV 文件并将组合的新集合写入新的 CSV 文件
- mocking - 开玩笑模拟exports.name 无法正常工作
- angular - 关于在组件中直接更新服务数据的问题
- php - Wordpress 城市前缀到 url 作为子域和子页面