access_token совпадает с id_token при попытке получить токен доступа с помощью ADAL.js AuthenticationContext?
Я аутентифицирую свое одностраничное приложение (Angular4) с помощью Azure AD и использую Adal.js для него. На странице входа в систему я нажимаю кнопку, которая перенаправляет в Microsoft AAD и при успешном входе в систему перенаправляет обратно на домашнюю страницу приложения и получает id_token
и информация о пользователе от JWT.
мне нужно access_token
для внутреннего доступа к API, который я пытаюсь получить через ADAL AuthenticationContext
"s getCachedToken()
метод и отправка clientId в качестве параметра:
this.context.getCachedToken(this.configService.AdalConfig.clientId)
Но этот метод возвращает тот же токен, который хранится в хранилище сессии, как id_token (adal.idtoken)
, Он в основном создает новый элемент в хранилище сеанса с помощью связанного ключа, который имеет то же значение, что и id_token
adal.access_token.key + clientId = id_token
например: adal.access_token.key239f6fc7-64d2-3t04-8gfd-501efc25adkd = <id-token-value>
,
Я также пытался получить access_token
с AuthenticationContext.acquireToken()
метод, но это тоже дало id_token
назад.
Куда я иду не так?
РЕДАКТИРОВАТЬ: размещение кода. Я вызываю функцию login()
, и после успешного входа в систему, пытаясь получить токен доступа на домашней странице через get accessToken()
собственность собственности в adal.config.ts
,
config.service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class ConfigService {
constructor() {}
public get AdalConfig(): any {
return {
tenant: 'common',
clientId: <application-id>,
redirectUri: window.location.origin + '/',
postLogoutRedirectUri: window.location.origin + '/'
};
}
}
adal.service.ts
import { ConfigService } from './config.service';
import { Injectable } from '@angular/core';
import { adal } from 'adal-angular';
let createAuthContextFn: adal.AuthenticationContextStatic = AuthenticationContext;
@Injectable()
export class AdalService {
private context: adal.AuthenticationContext;
constructor(private configService: ConfigService) {
this.context = new createAuthContextFn(configService.AdalConfig);
}
login() {
this.context.login();
}
logout() {
this.context.logOut();
}
handleCallback() {
this.context.handleWindowCallback();
}
public get userInfo() {
return this.context.getCachedUser();
}
public get accessToken() {
return this.context.getCachedToken(this.configService.AdalConfig.clientId);
// return this.context.acquireToken(this.configService.AdalConfig.clientId, function(message, token, response) {
// console.log(message, token, response);
// });
}
public get isAuthenticated() {
return this.userInfo && this.accessToken;
}
}
1 ответ
На самом деле, после небольшого чтения оказалось, что для подключения SPA к Azure AD требуется поток неявного предоставления OAuth 2.0. Документация Microsoft гласит:
В этом случае, когда пользователь входит в систему, клиентский интерфейс JavaScript использует библиотеку проверки подлинности Active Directory для JavaScript (ADAL.JS) и неявную привилегию авторизации для получения токена идентификатора (id_token) из Azure AD. Токен кэшируется, и клиент присоединяет его к запросу в качестве токена-носителя при совершении вызовов к своему внутреннему интерфейсу Web API, который защищен с помощью промежуточного программного обеспечения OWIN.
Итак, это id_token
Сам, что мне нужно отправить на серверные API, которые в свою очередь могут быть проверены и использованы. Более подробная информация о валидации приведена здесь:
Простого получения id_token недостаточно для аутентификации пользователя; Вы должны проверить подпись id_token и проверить утверждения в токене в соответствии с требованиями вашего приложения. Конечная точка v2.0 использует веб-токены JSON (JWT) и криптографию с открытым ключом, чтобы подписывать токены и проверять их действительность.
Вы можете выбрать проверку id_token в клиентском коде, но обычной практикой является отправка id_token на внутренний сервер и выполнение проверки там. После того, как вы проверили подпись id_token, есть несколько утверждений, которые вам необходимо будет проверить.
Я столкнулся с такой же проблемой, как ваша, когда пытался отправить токен в конечную точку.Net Core API. Он работал для меня, когда я послал маркер из adal.access.token.key узла, на sessionStorage.
Использование значений токенов adal.access.token.key или adal.idtoken (они одинаковы) у меня не сработало.