Azure AD 身份验证使用 idToken 或 accessToken 失败。我应该使用哪一个?
Posted
技术标签:
【中文标题】Azure AD 身份验证使用 idToken 或 accessToken 失败。我应该使用哪一个?【英文标题】:Azure AD authentication failed using idToken or accessToken. Which one should I use? 【发布时间】:2020-05-01 17:41:57 【问题描述】:在 azure 活动目录文档中指出:
idToken:id_tokens are sent to the client application as part of an OpenID Connect flow. They can be sent along side or instead of an access token, and are used by the client to authenticate the user.
accessToken:Access tokens enable clients to securely call APIs protected by Azure
我正在使用msal 将用户登录到我的 vue 应用程序(单页 Web 应用程序)并尝试获取我的 REST API 的 accessToken。
我的目标是将前端的身份验证流程与后端分开,以便将来多个客户端应用程序可以通过 accessTokens 访问 REST API。
登录时,我会弹出权限提示,然后在msal.aquireTokenSilent(config)
的令牌响应中同时收到一个 idToken token.idToken.rawIdToken
和一个 accessToken token.accessToken
。
我正在使用护照和 passport-azure-ad 和 BearerStrategy
来验证 accessToken 作为中间件。如果我通过带有 Authorization Bearer 标头的 token.accessToken
,我会收到 authentication failed due to: invalid signature
错误。如果我通过
token.idToken.rawIdToken
相反,如果我在承载策略配置中设置 validateIssuer: true
,我会收到 authentication failed due to: jwt issuer is invalid
。
首先,我想知道要使用哪个令牌?两者都是有效的 jwt 令牌 (https://jwt.ms/),但它们包含不同的字段。我想到目前为止 idToken 听起来更有希望,但我不确定这是否是可行的方法,因为我需要将前端的 clientId 指定为后端的观众字段,否则它会抛出 authentication failed due to: jwt audience is invalid
。所以这不是多客户的方式,对吧?
【问题讨论】:
【参考方案1】:我们使用 ID 令牌来检查用户是否已通过身份验证并获取他们的帐户详细信息。访问令牌仅用于保护 api 调用。
您可以阅读有关 Azure 文档的更多信息,特别是:
应使用 ID 令牌来验证用户是否是他们声称的身份并获取有关他们的其他有用信息 - 它不应代替访问令牌用于授权。
https://docs.microsoft.com/en-us/azure/active-directory/develop/id-tokens
【讨论】:
感谢您的回复。正如我所写,我的目标是保护我的 API 调用,这意味着我需要 accessToken 但它的签名错误。这就是我感到困惑的原因。 我们必须在 b2c 部分的 azure 门户中指定大量内容、正确的范围、策略、注册的客户端 ID 和 URL ......这很......有趣! ;p @Andre - 访问令牌用于保护 Azure 资源。如果您的目标是保护您自己的资源(API 端点),请使用身份令牌。访问令牌是不透明的。不要费心尝试解码它们。调用 Azure 端点来验证它们。【参考方案2】:您可以使用 AAD 颁发的访问令牌来保护您自己的自定义 Web API。请注意,您必须首先创建自定义范围,然后让用户同意该范围。完成此操作后,将为您的应用程序颁发该范围的令牌(访问令牌是按资源颁发的,这意味着您无法使用用于 MS Graph 的令牌来保护您的自定义 Web API)。
查看我的评论 here 了解更多信息。
【讨论】:
谢谢!这就是我一直在寻找的答案。如果您有自己的 API 和自己的范围,则必须获取新的 accessToken!谢谢!以上是关于Azure AD 身份验证使用 idToken 或 accessToken 失败。我应该使用哪一个?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Angular 8 中的 MSAL 库获取 Microsoft Azure AD 组名称列表
401- 使用 REST API Dynamics CRM 和 Azure AD 进行未经授权的身份验证
Unity for Android 中的 Azure AD 身份验证出错
[Azure - Security] Azure的多重身份验证:使用AD(Azure Active Directory)开启用户MFA