У нас есть 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, которая будет использоваться всеми приложениями, которым необходимо напрямую отправлять запросы к Сервису?