Получите токен с MSAL. Net с использованием секрета клиента вместо учетных данных пользователя - PullRequest
0 голосов
/ 11 июля 2020

У нас есть AppService, который запускает AngularJS одностраничное приложение (WebApp), и AppService, который запускает. Net Service (Service).

WebApp предлагает пользователю войти в систему и получает токен на предъявителя, чтобы иметь возможность делать запросы к Сервису. Если я скопирую токен на предъявителя и использую его в Postman, я могу направить прямые запросы в Службу.

Если я попытаюсь сделать прямой запрос в Службу для токена, я получаю сообщение о том, что мне нужен арендатор. согласие администратора, поэтому вся авторизация выполняется через регистрацию в WebApp AAD.

Я пытаюсь программно делать запросы к сервису. Вместо использования имени пользователя и пароля я добавил секрет клиента в нашу регистрацию приложения AAD для WebApp. Используя этот секрет, я могу получить токен-носитель с областью действия https://tenant.onmicrosoft.com/Service/.default, но я немного сбит с толку, поскольку этот токен не работает в PostMan. Я думаю, что токен предназначен для веб-приложения, а не для службы, и каким-то образом мне нужно использовать его для получения токена службы.

Я поигрался с простой страницей, которая создала бы рабочий токен (тот, который я мог бы использовать в Postman), хотя для этого требуется логин и пароль. Код JavaScript был:

window.config = {
   clientId: 'WebApp client id',
   tenant: 'Tenant id',
   redirectUri: 'http://localhost:3000',
   extraQueryParameter: 'nux=1',
   popUp: true,
   endpoints : {
    'prod':
        'Service client id'
   }
};

var user = authContext.getCachedUser();
    if (!user) {
        authContext.login();
        return;
    }
    var cachedToken = authContext.getCachedToken(window.config.endpoints.prod);
    if (!cachedToken) {
        authContext.acquireToken("**Service client id**", function(error, token) {
            console.log(error);
            console.log('Token:'+token);
        });
    }
    console.log(cachedToken);
    var t = document.getElementById("token");
    t.innerText = cachedToken;

Выполнение этого на localhost: 3000 приведет к созданию токена, который можно использовать в Postman.

Теперь я пытаюсь сделать это программно, используя MSAL. net. При запуске AcquireTokenForClient я получаю токен на предъявителя, но он не работает. Я не знаю, как получить токен службы с помощью моего токена WebApp, а для AcquireTokenOnBehalfOf требуются учетные данные пользователей. Я также не могу получить токен непосредственно из Службы, потому что я получаю ошибку, требующую согласия администратора.

result =  app.AcquireTokenForClient(scopes)
                    .ExecuteAsync().Result;
// the token in the result does not work in postman

Я думаю, что регистрация приложения WebApp AAD, которая является единственной с согласия администратора - Granted for Tenant проверяет, должен ли данный пользователь иметь доступ к приложению, а затем, если ему разрешено, получает токен для Сервиса от имени этого пользователя.

Можно ли получить этот токен с помощью Client Secret или нам нужно создать фиктивную учетную запись пользователя в AAD, которая будет использоваться всеми приложениями, которым необходимо напрямую отправлять запросы к Сервису?

1 Ответ

2 голосов
/ 11 июля 2020

Для учетных данных клиента (например, секретов) области, которые вы можете получить, определены в разрешениях api регистрации приложения как «разрешения приложения», а НЕ «делегированные разрешения» поток учетных данных клиента не может получить поток делегированных разрешений. Кроме того, как только вы дадите приложению разрешение, вы должны щелкнуть грант для арендатора ... если вы этого не сделаете, оно не сможет его использовать. Я предполагаю, что у вас есть регистрация приложения для службы API и регистрация другого приложения для веб-приложения.

В appreg для службы вам нужно будет добавить роль приложения в манифест. это приведет к появлению разрешения приложения, когда вы попытаетесь добавить разрешение api из веб-приложения.

Вот некоторая информация об этом: https://joonasw.net/view/defining-permissions-and-roles-in-aad

...