Как обеспечить авторизацию роли приложения AAD с помощью функций Azure? - PullRequest
0 голосов
/ 14 апреля 2020

На этой странице описано, как добавить Приложение роли приложения к приложению в 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, как вы заставить его принадлежать роли приложения?

Я гуглил, но не смог найти четкую документацию, объясняющую, как это авторизация делается для Azure функций.


Приложение "Моя тестовая функция"

Я создал простую функцию "hello " Azure из портала Azure, который я вызываю из Почтальона.

#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 только к приложениям, которые имеют определенную c роль приложения.

1 Ответ

1 голос
/ 15 апреля 2020

Я не знаю, как ограничить доступ к функции Azure только для приложений, которые имеют определенную c роль приложения.

Если вы просто хотите приложение, которое имеет разрешение ConsumerApps для доступа к вашей функции, выполните следующие действия.

1. Перейдите в приложение AD вашей функции в Azure Active Directory на портале -> щелкните Managed application in local directory -> Properties -> установить User assignment required на Yes.

enter image description here

enter image description here

2.После того, как вы попытаетесь снова получить токен с помощью приложения AD, вы обнаружите, что приложение не может получить токен успешно, вы получите сообщение об ошибке, как показано ниже, поскольку ваше клиентское приложение не имеет разрешения ConsumerApps.

enter image description here

3. Для успешного доступа к функции нам просто нужно добавить разрешение для приложения Client AD, которое вы использовали.

Перейдите к клиентскому приложению AD на портале -> API permissions -> Add a permission -> нажмите APIs my organization uses -> найдите свою функцию Имя приложения AD -> щелкните приложение -> Application permissions -> добавьте разрешение Consumer -> нажмите кнопку Grant admin consent for xxx .

enter image description here

enter image description here

enter image description here

Подождите некоторое время, затем попробуйте снова получить токен, он работает нормально.

enter image description here

Используйте токен для вызова функции, также работает.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...