Назначить роль секрету клиента в частном приложении - PullRequest
0 голосов
/ 18 октября 2019

В локальном приложении мы пытаемся получить доступ к API, который мы размещаем в Azure как частное приложение. Мы назначаем роли нашим пользователям, хотя AAD и роли определены в манифесте приложения

"appRoles": [    
...
    {
        "allowedMemberTypes": [
            "User",
            "Application"
        ],
        "description": "Read Only All",
        "displayName": "Read Only All",
        "id": "***",
        "isEnabled": true,
        "lang": null,
        "origin": "Application",
        "value": "ReadOnlyAll"
    }
],

Мы создали клиентский секрет, и пока мы можем подключиться к общедоступному приложению, следуя документации на MSALучетные данные клиента передаются , но при этом мы теряем возможность назначать роли. Кроме того, я могу подключиться к частному приложению после Аутентификации в Azure AD в приложениях-демонах с сертификатами , но мы получаем ошибку, сообщающую, что клиентскому приложению не назначена роль для приложения-службы. поэтому на данный момент мы не можем получить токен от Azure с ролью, назначенной клиентскому приложению.

Прямого (насколько мы можем судить) способа назначения клиентского приложения не существует. роль частного приложения, будь то через сертификаты и секреты, разрешения API или авторизованные клиентские приложения.

Итак, подведем итог: у меня вопрос: можно ли назначить роль локальному клиентскому приложению, которое читает из приложения-службы, размещенного в Azure.

Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Если вы хотите назначить роль корпоративного приложения для приложения, которое вы зарегистрировали в «Регистрация приложений», AFAK, мы не можем сделать это на портале Azure, но мы можем завершить этот процесс с помощью Azure AD Powershell, попробуйте команду ниже:

Connect-AzureAD 

$appObjId = "object id of the app that you want to assign role to"
$roleOwnerAppObjId = "object id of the role owner app" 

$sp = Get-AzureADServicePrincipal -ObjectId $roleOwnerAppObjId

$role= $sp.AppRoles | Where-Object { $_.DisplayName -eq "Read Only All" }

New-AzureADServiceAppRoleAssignment -ObjectId $appObjId -PrincipalId $appObjId -ResourceId $sp.ObjectId -Id $role.Id 

Идентификаторы объектов можно найти здесь: enter image description here

После того, как я назначил роль, как вы можете видеть, заявка на роль будет добавлена, когда язапросить токен доступа к ресурсам приложения владельца роли: enter image description here

enter image description here

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

0 голосов
/ 24 октября 2019

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

Я зарегистрировал частные приложения для предварительных развертываний приложений и назначил приложение приложенийразрешения (роль) в Azure Ad> регистрация приложения> мои API> разрешения приложения. Требуется наличие роли в приложении Azure с

"allowedMemberTypes": [
            "User",
            "Application" 
        ],

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

С ролью, назначенной приложению, я мог отформатировать свой поток аутентификации, следуя документации по v2 oauth 2.0 поток учетных данных клиента . по существу, используя предварительно зарегистрированное приложение с секретом клиента и новой областью, чтобы получить требуемую аутентификацию (токен-носитель) для соединения с ролью частного приложения Azure с использованием библиотеки MSALAuthenticator

public MSALAuthenticator()
{
    _onPremClientId = "***";
    _tenantId = "***";
    _authorityFormat = "https://login.microsoftonline.com/{0}/v2.0";
    _onPremClientSecret = "***";
    _scope = _onPremClientId + "/.default";

    _confAuthClient = ConfidentialClientApplicationBuilder.Create(_onPremClientId)
        .WithAuthority(string.Format(_authorityFormat, _tenantId))
        .WithClientSecret(_onPremClientSecret)
        .Build();

   authResult = await _confAuthClient.AcquireTokenForClient(new[] { _scope }).ExecuteAsync();

    //this will be the authentication information, including bearer token for authentication headers to uses in api requests
    return authResult;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...