Недостаточно прав для назначения разрешений Azure Active Directory функции Azure с поддержкой MSI?

У нас есть два лазурных ресурса в одном каталоге. Набор API-интерфейсов webAPI для управления API Azure и функции Azure. Мы хотим, чтобы функция azure могла вызывать API. Мы включили MSI для функции azure, как описано в Как использовать управляемые удостоверения для службы приложений и функций Azure. Мы создали регистрацию приложения в AAD для API, создали разрешение роли для доступа. После Вызов ваших API с помощью идентификатора управляемой службы Azure AD используя разрешения приложения, мы сталкиваемся с ошибками при попытке назначить разрешение / роль для функции azure: в PowerShell:

New-AzureADServiceAppRoleAssignment -ObjectId 8XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -Id 3XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -PrincipalId 8XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -ResourceId 9XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

New-AzureADServiceAppRoleAssignment : Error occurred while executing NewServicePrincipalAppRoleAssignment
Code: Authorization_RequestDenied
Message: Insufficient privileges to complete the operation.
HttpStatusCode: Forbidden
HttpStatusDescription: Forbidden
HttpResponseStatus: Completed
At line:1 char:1
+ New-AzureADServiceAppRoleAssignment -ObjectId 8XXXXXX-XXXX-XXXX-XXXX ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-AzureADServiceAppRoleAssignment], ApiException
    + FullyQualifiedErrorId : Microsoft.Open.AzureAD16.Client.ApiException,Microsoft.Open.AzureAD16.PowerShell.NewServ
   icePrincipalAppRoleAssignment

выдает нам ошибку разрешения, даже когда администратор AAD (я думаю, член AAD DC Administrators) запускает его. Кто-нибудь сталкивался с этим раньше? Почему это вызывает ошибку разрешений? Мы проверили правильность идентификаторов у 3 разных людей.


person TheEmirOfGroofunkistan    schedule 19.09.2018    source источник


Ответы (1)


Проблема, с которой вы, вероятно, столкнулись, заключается в том, что, несмотря на то, что регистрация вашего приложения называется тем же, что и приложение с поддержкой MSI, в конечном итоге эти два объекта представляют разных субъектов-служб в AAD. Использование регистрации приложений с помощью MSI в настоящее время не поддерживается.

Попробуйте запустить команды powershell, используя вместо этого идентификатор объекта идентификатора MSI. Я смог заставить это работать и предоставил моему приложению с поддержкой MSI доступ к Graph Api.

Вот PS, который я использовал для назначения ролей GraphApi, необходимых моему функциональному приложению:

$functionAppName = "My-FANCY-FUNC"

$context = Get-AzureRmContext -ErrorAction SilentlyContinue #this lets you search AAD for func

if(!$context){
    $login = Connect-AzureRmAccount  | Out-Null
    Connect-AzureAD #needed this for Graph API
    $context = $login
} else { Write-Host "Login session already established for " $context.Subscription.SubscriptionName }

#get the SP associated with the MSI
$MSIPrincipal = Get-AzureRmADServicePrincipal -SearchString $functionAppName | Where-Object DisplayName -eq $functionAppName

#get the SP associatesd with the MS Graph
$graph = Get-AzureADServicePrincipal -All $true | ? { $_.DisplayName -match "Microsoft Graph" }

#find the target app roles in the graph
$targetRoles = $graph.AppRoles | Where-Object Value -in "Group.ReadWrite.All", "Directory.ReadWrite.All"

#iterate throgh the known roles and add the MSI SP to them
$targetRoles | ForEach-Object {New-AzureADServiceAppRoleAssignment -Id $_.Id -PrincipalId $MSIPrincipal.Id -ObjectId $MSIPrincipal.Id -ResourceId $graph.ObjectId}

На основании вашего вопроса я подозреваю, что эта строка вернет более одного объекта:

Get-AzureRmADServicePrincipal -SearchString $functionAppName | Where-Object DisplayName -eq $functionAppName

Удаление посторонней регистрации приложения должно прояснить это

person Josh    schedule 20.09.2018
comment
Спасибо за ответ. К сожалению, я передаю указанные вами значения: New-AzureADServiceAppRoleAssignment -ObjectId AzureFunction (MSIPrincipal) -Id AppRole (идентификатор роли приложения, созданной в манифесте регистрации приложения) -PrincipalId AzureFunction (MSIPrincipal) -ResourceId AzureAPI (AAD Principal) - person TheEmirOfGroofunkistan; 20.09.2018
comment
просто для пояснения, единственная регистрация приложения - для API. Функция регистрируется только через MSI. - person TheEmirOfGroofunkistan; 21.09.2018
comment
Можете ли вы поделиться аутентификационными частями сценария PS? Вы используете Connect-AzureAD или Connect-AzureRmAccount или оба? - person Josh; 21.09.2018
comment
честно говоря, сценария не было. Нам пришлось сделать это один раз, поэтому мы вручную получили идентификаторы, необходимые для вызова New-AzureADServiceAppRoleAssignment, который у меня есть выше. - person TheEmirOfGroofunkistan; 24.09.2018
comment
Если вы просто набрали это в консоли, это не сработает. Вам необходимо авторизовать сеанс в AAD и Azure. Предоставленный мной сценарий будет работать или поможет вам понять, где у пользователя нет разрешения. - person Josh; 24.09.2018