我正在使用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 + '/'
};
}
}
答案 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 令牌值(它们相同)对我不起作用。