当前位置: 首页 > 知识库问答 >
问题:

如果范围是graph.microsoft.com,则访问令牌验证失败

巫马炫明
2023-03-14

从AAD接收访问令牌,使用下面的urlhttps://login.microsoftonline.com/gdfdddddd-87dd-497c-b894-xxxxxx/oauth2/v2.0/token

grant_type :client_credentials

客户端id:xxxxx-1ff 5-4615-8d 71-yyyyy

client_secret:[7aCw]fdsfsfsfds.AC61Fg: cm33

适用范围 : https://vault.azure.net/.default

使用以下代码手动验证上述收到的令牌

 IConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>("https://login.microsoftonline.com/TestDomain310320.onmicrosoft.com/v2.0/.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());
            OpenIdConnectConfiguration openIdConfig = AsyncHelper.RunSync(async () => await configurationManager.GetConfigurationAsync(CancellationToken.None));

            TokenValidationParameters validationParameters =
                new TokenValidationParameters
                {
                    ValidIssuer = "https://sts.windows.net/a3d2bff3-87dd-497c-b894-f63befdd7496/",
                    ValidAudiences = new[] { "https://vault.azure.net" },
                    IssuerSigningKeys = openIdConfig.SigningKeys
                };

            SecurityToken validatedToken;
            JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
            var user = handler.ValidateToken(token, validationParameters, out validatedToken);

修改的参数范围:https://graph.microsoft.com/.default

观察:

收到的令牌范围:https://vault.azure.net/.default

     {
       "typ": "JWT",
      "alg": "RS256",
       "x5t": "YMELHT0gvb0mxoSDoYfomjqfjYU",
       "kid": "YMELHT0gvb0mxoSDoYfomjqfjYU"
      }

虽然令牌接收范围:https://graph.microsoft.com/.default有额外的随机数属性,以避免重放攻击,这是令牌验证失败的原因吗?

   {
     "type": "JWT",
    "nonce": "wCXLm9rF5Nma2S7OswU44uAVRpVbM_20WrWJkqbWe6Y",
    "alg": "RS256",
   "x5t": "YMELHT0gvb0mxoSDoYfomjqfjYU",
   "kid": "YMELHT0gvb0mxoSDoYfomjqfjYU"
 }

请建议。

共有2个答案

宣滨海
2023-03-14

是的,该错误是由 JWT 标头中的随机数字段引起的。

据我所知,如果我们请求图形 API 的访问令牌,JWT 令牌将包含随机数字段。然后我们无法在后端验证它(出于安全原因,微软不允许我们执行此操作)。

茹正祥
2023-03-14

您不应该查看或验证未颁发给您自己的Apis的令牌。预期接收方、KeyVault和MS Graph将自行进行必要的验证。您应该将这些访问令牌视为一个不透明的blob,在调用这些Api时将其塞入Authorization头中。

Api所有者、Graph或KeyVault明天可以更改其中的声明,甚至选择加密它们的令牌,这样你的代码就会崩溃。

为什么要验证令牌?如果您正在读取应用程序中不属于您的Apis的验证令牌作为身份验证的证明,那么您正在为失败做好准备。此外,这也是一个安全问题,因为世界上任何可以获得KeyVault或MS图形的访问令牌的应用程序都可以将其传递给您的Apis并对其进行破坏。

下面是供参考的讨论 - 无法验证签名。#609

 类似资料:
  • 授权端点和令牌端点允许客户端使用“scope”请求参数指定访问请求的范围。反过来,授权服务器使用“scope”响应参数通知客户端颁发的访问令牌的范围。 范围参数的值表示为以空格分隔,大小写敏感的字符串。 由授权服务器定义该字符串。如果该值包含多个空格分隔的字符串,他们的顺序并不重要且每个字符串为请求的范围添加一个额外的访问区域。 scope = scope-token *( SP scope-to

  • 在错误=我正在获取“消息”的上下文中需要帮助:“Access token validation Failure.Invalid Pavior.”, 我正在使用OAuth中的授权代码授予类型。我已经使用Azure广告策略将自定义声明映射到应用程序。因此,如果用户Scope=appid/.default,那么我将在令牌中获得一个自定义声明,并在Azure AD上对应用程序具有API权限,如user.r

  • 我在谷歌上搜索了很多关于这个问题的信息,但没有任何帮助。我也看到过许多类似的帖子,但没有什么用处。 我正在使用MS Graph API V2访问用户电子邮件、日历和联系人数据。 授权URL: https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=ABC 令牌请求URL: https://login.micr

  • 我正在使用以下示例来玩Spring Cloud OAuth2实现: https://github.com/spring-cloud-samples/authserver https://github.com/spring-cloud-samples/sso 第一个是OAuth服务器,它在对用户进行身份验证时生成JWT令牌。第二个是正在被消耗的资源。根据OAuth规范,资源将用户的身份验证转发给au

  • 当我试图在访问令牌过期之前使用刷新令牌生成访问令牌时,系统会生成一个新令牌,并且一切正常。但是如果访问令牌过期,则请求返回。 中的方法不是使用我从以前的访问令牌中存储在字典中的标识生成访问令牌吗? 如果上一个更新令牌尚未过期,如何阻止客户端使用相同的刷新令牌请求新的访问令牌? oauthProvider.cs: RefreshTokenProvider.cs: 对不起,英语不好,希望你能理解!

  • 我已经做了一段时间了,我想看看是否有人知道我可能做错了什么。我想做的是使用提供的Spotify Web API将歌曲添加到播放列表中。根据这方面的文件https://developer.spotify.com/documentation/web-api/reference/playlists/add-tracks-to-playlist/我需要确定用户的范围。 “将曲目添加到当前用户的私人播放列表