尝试使用ADAL.js AuthenticationContext获取访问令牌时,access_token与id_token相同?

时间:2017-11-11 04:58:46

标签: javascript angular azure-active-directory adal adal.js

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

我需要access_token用于后端API访问,我试图通过ADAL AuthenticationContext的{​​{1}}方法获取该访问权限,并将clientId作为参数:

getCachedToken()

但是此方法返回与this.context.getCachedToken(this.configService.AdalConfig.clientId) 一样存储在会话存储中的相同令牌。它基本上使用连接键在会话存储中创建一个新项目,该键具有与id_token (adal.idtoken)相同的值

id_token

ex: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()属性访问器在主页中获取访问令牌。

config.service.ts

adal.config.ts

adal.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 + '/'
    };
  }
}

2 个答案:

答案 0 :(得分:3)

实际上,经过一些阅读后,发现将SPA连接到Azure AD需要OAuth 2.0隐式授权流程。 Microsoft documentation说:

  

在这种情况下,当用户登录时,JavaScript前端   使用JavaScript的Active Directory身份验证库(ADAL.JS)   以及获取ID令牌的隐式授权授权(id_token)   来自Azure AD。令牌被缓存,客户端将其附加到   在调用其Web API后端时请求作为持有者令牌,   使用OWIN中间件保护。

因此,我需要将id_token本身发送到后端API,而后端API又可以进行验证和使用。有关验证的更多信息,请参阅here

  

仅接收id_token不足以验证用户;   您必须验证id_token的签名并验证其中的声明   根据您应用的要求提供令牌。 v2.0端点使用JSON Web   令牌(JWT)和公钥加密,用于签署令牌和验证   他们是有效的。

     

您可以选择验证客户端中的id_token   代码,但通常的做法是将id_token发送到后端   服务器并在那里执行验证。一旦你验证了   id_token的签名,有一些声称你将需要   验证。

答案 1 :(得分:0)

当我尝试将令牌发送到.Net Core API端点时,遇到了像您这样的问题。 当我从sessionStorage上的 adal.access.token.key 节点发送令牌时,它对我有用。

使用 adal.access.token.key adal.idtoken 令牌值(它们相同)对我不起作用。

Valid token on adal.access.token.key node.