首页 > 解决方案 > 使用客户端 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;

标签: authenticationazure-active-directoryazure-functions

解决方案


您需要通过清单将至少一个应用程序权限(具有允许的成员类型应用程序的 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 中的显示方式。


推荐阅读