尝试验证 Azure AD 令牌时收到错误“IDX10511:签名验证失败”

Lan*_*ceM 2 wcf jwt azure-active-directory openid-connect angular

我有一个 Angular 10 应用程序,它使用 oidc 对 Azure AD 进行身份验证。它成功获取令牌,然后对 WCF 服务(.net framework 4.7)进行 REST 调用,发送它从 Azure 收到的令牌。WCF 服务中的验证代码失败并显示以下错误:IDX10511:签名验证失败。尝试过的键:'System.Text.StringBuilder'。孩子:'System.String'。捕获异常:'System.Text.StringBuilder'。令牌:'System.IdentityModel.Tokens.Jwt.JwtSecurityToken'。

如果我使用 Auth0 进行身份验证,则相同的 WCF 代码能够验证来自 Auth0 的 jwt,没有错误。

以下是我的 oidc 客户端的 UserManagerSettings:

          this.stsSettings = {
            authority: "https://login.microsoftonline.com",
            client_id: myclientId,
            redirect_uri: `${myclientRoot}signin-callback`,
            scope: "openid profile email",
            response_type: "code",
            loadUserInfo: false, // setting loadUserInfo to true causes error because CORS blocks the call to the user info endpoint.
            post_logout_redirect_uri: `${myclientRoot}signout-callback`,
            silent_redirect_uri: `${myclientRoot}assets/silent-callback.html`,
            metadata: {
              issuer: `${mystsAuthority}/${mytenantId}/v2.0`,
              authorization_endpoint: `${mystsAuthority}/${mytenantId}/oauth2/v2.0/authorize`,
              token_endpoint: `${mystsAuthority}/${mytenantId}/oauth2/v2.0/token`,
              "jwks_uri": `https://login.microsoftonline.com/${mytenantId}/discovery/v2.0/keys`,
            }
Run Code Online (Sandbox Code Playgroud)

我在 WCF 服务中的 C# 代码来验证令牌

                JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();

                JwtSecurityToken jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;

                if (jwtToken == null)
                {
                    return null;
                }


                IConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>($"{Properties.Settings.Default.ValidIssuer.TrimEnd('/')}/.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());

                OpenIdConnectConfiguration openIdConfig = await configurationManager.GetConfigurationAsync(CancellationToken.None);

                var validationParameters = new TokenValidationParameters()
                {
                    LifetimeValidator = LifetimeValidator,
                    ValidAudiences = new[] { Properties.Settings.Default.CommaDelimitedValidAudiences },
                    AudienceValidator = AudienceValidator,
                    ValidIssuer = Properties.Settings.Default.ValidIssuer,
                    ValidateLifetime = true,
                    RequireExpirationTime = true,
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateIssuerSigningKey = false,
                    IssuerSigningKeys = openIdConfig.SigningKeys,
                    RequireSignedTokens = false
                };

                SecurityToken securityToken;
                var principal = tokenHandler.ValidateToken(token, validationParameters, out securityToken);

                return principal;
            }

            catch (Exception ex)
            {
                return null;
            }
Run Code Online (Sandbox Code Playgroud)

异常发生在代码处 tokenHandler.ValidateToken(token, validationParameters, out securityToken);

我尝试了各种在线建议,在 Azure 中添加范围,“0 字节前缀”的解决方法等,但它们没有奏效。

我已经在这太久了,我的想法已经用完了。

请帮忙。

谢谢,

Lan*_*ceM 5

我张贴这个以防万一它会帮助别人。

我主要通过在 Azure AD 中添加一些额外配置来解决这个问题。我转到“公开 API”并添加了一个新范围(保留所有默认值并将“myapi”放在“范围名称”、“管理员同意显示名称”和“管理员同意描述”字段中。然后单击“添加”一个客户端应用程序”,输入我的应用程序的客户端 ID(可以在概述中找到),勾选授权范围复选框,然后单击“添加应用程序”。完成此操作后,范围有一个类似于“api://09098082309823009ljo24”的条目/myapi”,我复制了它。然后我将它添加到我的 oidc 客户端的 UserManagerSettings 的范围中。这个值成为我的令牌中的受众,您可能需要验证您的令牌。

  • 我不知道为什么还没有人认可你,但这对我帮助很大。感谢您发布此内容。 (2认同)