Как принудительно выполнить авторизацию роли приложения AAD с помощью функций Azure?
На этой странице описывается, как добавить роли приложения приложения в приложение в Azure Active Directory с помощью манифеста.
Пример кода со страницы:
"appId": "8763f1c4-f988-489c-a51e-158e9ef97d6a",
"appRoles": [
{
"allowedMemberTypes": [
"Application"
],
"displayName": "ConsumerApps",
"id": "47fbb575-859a-4941-89c9-0f7a6c30beac",
"isEnabled": true,
"description": "Consumer apps have access to the consumer data.",
"value": "Consumer"
}
],
"availableToOtherTenants": false,
При вызове функции Azure из приложения, аутентифицированного с помощью client_credentials
тип предоставления, как обеспечить его принадлежность к роли приложения?
Я искал в Google, но не смог найти четкую документацию, объясняющую, как выполняется авторизация для Функций Azure.
Приложение My Test Function
Я создал простую функцию Azure "hello
#r "Microsoft.Azure.WebJobs.Extensions.Http"
#r "Newtonsoft.Json"
using System.Net;
using System.Security.Claims;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
public static IActionResult Run(HttpRequest req, ILogger log, ClaimsPrincipal claimsPrincipal)
{
var name = req.Query["name"];
log.LogInformation($"C# HTTP trigger function processed a request: {name}");
var cp = new {
Identity = new {
claimsPrincipal.Identity.AuthenticationType,
claimsPrincipal.Identity.IsAuthenticated,
claimsPrincipal.Identity.Name
},
Claims = claimsPrincipal.Claims.Select(claim => new
{
claim.Type,
claim.Value
})
};
log.LogInformation($"ClaimsPrincipal ({claimsPrincipal.GetType().FullName}): {JsonConvert.SerializeObject(cp, Formatting.Indented)}");
return (IActionResult)new OkObjectResult($"Hello, {name}");
}
Сначала я аутентифицирую, используя https://login.microsoftonline.com/<Tenant ID>/oauth2/v2.0/token
и захватить access_token
.
Пример тела запроса:
grant_type:client_credentials
client_id:<Application ID>
client_secret:<Client Secret>
scope:https://<Function-app-name>.azurewebsites.net/.default
Пример результата:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "eyJ0eXAi......"
}
Затем я вызываю свою функцию Azure, используя https://<function-app-name>.azurewebsites.net/api/hello?name=World
и заголовок, содержащий Authorization: Bearer eyJ0eXAi......
.
Аутентификация работает нормально, как и вызов функции Azure. Однако я могу добавить новое приложение через регистрацию приложений на портале Azure, пройти аутентификацию, а затем свободно вызвать функцию Azure. Я не знаю, как ограничить доступ к функции Azure только для приложений с определенной ролью приложения.
1 ответ
Я не знаю, как ограничить доступ к функции Azure только для приложений с определенной ролью приложения.
Если вам просто нужно приложение с ConsumerApps
разрешение на доступ к вашей функции, выполните следующие действия.
1. Перейдите к приложению AD вашей функции в Azure Active Directory на портале -> щелкните значок Managed application in local directory
-> Properties
-> установить User assignment required
к Yes
.
2. Затем вы можете снова попытаться получить токен с помощью приложения AD, вы обнаружите, что приложение не может успешно получить токен, вы получите сообщение об ошибке, как показано ниже, потому что ваше клиентское приложение не имеет ConsumerApps
разрешение.
3. Для успешного доступа к функции нам просто нужно добавить разрешение приложения для клиентского приложения AD, которое вы использовали.
Перейдите к клиентскому приложению AD на портале -> API permissions
-> Add a permission
-> щелкните APIs my organization uses
-> найдите свою функцию Имя приложения AD -> щелкните приложение -> Application permissions
-> добавить Consumer
разрешение -> щелкнитеGrant admin consent for xxx
кнопка.
Подождите немного, затем попробуйте снова получить токен, он работает нормально.
Используйте токен для вызова функции, тоже работает.