我正在使用Azure AD对我的单页应用程序(Angular4)进行身份验证,并使用Adal.js进行相同的操作。在登录页面上,我单击重定向到Microsoft AAD的按钮,并在成功登录后重定向到应用程序主页,并从JWT接收id_token和用户信息。

我需要access_token进行后端API访问,这是我尝试通过ADAL AuthenticationContextgetCachedToken()方法获取的,并发送clientId作为参数:

this.context.getCachedToken(this.configService.AdalConfig.clientId)

但是此方法返回的 token 与id_token (adal.idtoken)相同,该 token 存储在 session 存储中。它基本上是通过使用级联键在 session 存储中创建一个新项目的,该键具有与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属性访问器在主页中获取访问 token 。

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;
  }
}

最佳答案

实际上,经过一番阅读之后,事实证明将SPA连接到Azure AD需要OAuth 2.0隐式授予流。 Microsoft documentation说:

因此,我需要将id_token本身发送到后端API,然后可以对其进行验证和使用。给出更多有关验证的信息here:

关于javascript - 尝试使用ADAL.js AuthenticationContext获取访问 token 时,access_token与id_token相同吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47234519/

10-12 05:23