验证Azure广告访问令牌时签名无效,但id令牌有效

Jep*_*ppe 1 validation access-token oauth-2.0 azure-active-directory adal

使用jwt.io验证我的Azure广告访问令牌时,我得到了无效签名。但是,我的ID令牌可以很好地验证!


在验证Azure广告访问令牌

https://nicksnettravels.builttoroam.com/post/2017/01/24/Verifying-Azure-Active-Directory-JWT-Tokens.aspx时,我已经看到并尝试了无效签名中建议的解决方案,
但是都不适合我的访问令牌。

访问和ID令牌是通过Adal.js生成的:

    var endpoints = {
        "https://graph.windows.net": "https://graph.windows.net"
    };
    var configOptions = {
        tenant: "<ad>.onmicrosoft.com", // Optional by default, it sends common
        clientId: "<app ID from azure portal>",
        postLogoutRedirectUri: window.location.origin,
        endpoints: endpoints,
    }
    window.authContext = new AuthenticationContext(configOptions);
Run Code Online (Sandbox Code Playgroud)

为什么我可以验证我的ID令牌,但不能验证我的访问令牌?

Ant*_*ine 34

如果其他人有无效签名错误,您应该检查此评论:https ://github.com/AzureAD/microsoft-authentication-library-for-js/issues/521#issuecomment-577400515

解决了我的配置问题。

本质上,如果您要获取访问令牌来访问您自己的资源服务器而不是 Graph API,则您的 scopes 参数应该是[CLIENT_ID]/.default(并且如果您使用访问令牌来访问 Graph API,则不需要自己验证令牌)


Ole*_*leh 22

感谢Nan Yu,我设法获得了可以由任何公共 jwt 验证器(如jwt.io)验证的令牌 (无法将我的评论放在Nan Yu的答案下的评论部分,因为它太长了)。

因此,据我从Nan Yu提到的讨论中了解到的观点,默认情况下 Azure AD 会为 Microsoft Graph 生成令牌,并且这些令牌使用特殊的签名机制,因此不可能使用公共验证器(除了jwt.ms Microsoft 的验证器)来验证签名。大多数人可能知道神秘的特殊处理意味着什么:))。

要获取可使用公共验证器进行验证的非 Microsoft Graph 的访问令牌,我必须:

  • 删除任何 Microsoft Graph 相关范围(默认情况下,我只配置了一个范围,User.Read因此在 appConfig > API 权限中将其删除)
  • 为您的应用程序创建一个自定义范围(appConfig > 公开 API > 添加范围...)此范围将如下所示api://{application-id}/scope-name
  • 在应用程序 API 权限中添加刚刚创建的范围(appConfig > API 权限 > 添加 api 权限 > 我的 API > 选择您的应用程序 > 委派权限 > 检查您的范围 > 添加权限)
  • 然后在你的 openid 客户端范围中使用这个范围,在我的例子中我有:openid offline_access {application-id}/scope-name

请注意,在 openid 客户端配置中,新创建的作用域不带 api:// 前缀(offline_access 我必须启用刷新令牌,如果不使用刷新令牌机制,则可以忽略)



小智 6

如果您将 msal.js 库与 React 一起使用,请将其添加到您的身份验证配置中。

scopes: [`${clientId}/.default`]
Run Code Online (Sandbox Code Playgroud)

编辑范围为我解决了问题


Nan*_* Yu 5

请参考线程:https : //github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/609

但是如果查看Jwt.Header,您将看到一个“ nonce”。这意味着您需要特殊处理。正常处理将失败。

因此,如果nonce包含在访问令牌中,则使用JWT.io或JwtSecurityToken验证签名不会成功。