尝试验证 Azure AD 令牌时出现错误 "IDX10511: Signature validation failed"

Get Error "IDX10511: Signature validation failed" when trying to validate an Azure AD token

我有一个 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`,
            }

我在 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;
            }

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

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

我做这个太久了,运行 没主意了。

请帮忙。

谢谢,

我发布这个以防它对其他人有帮助。

我主要通过在 Azure AD 中添加一些额外的配置来解决这个问题。我转到“Expose an API”并添加了一个新范围(保留所有默认值并将“myapi”放入“Scope name”、“Admin consent display name”和“Admin consent description”中”字段。然后我单击“添加客户端应用程序”,输入我的应用程序的客户端 ID(可以在概述中找到),勾选授权范围复选框,然后单击“添加应用程序”。完成后,范围有一个输入类似“api://09098082309823009ljo24/myapi”的内容,我复制了它。然后我将它添加到我的 oidc 客户端的 UserManagerSettings 中的范围。这个值成为我令牌中的观众可能需要验证您的令牌。