【问题标题】:Get Error "IDX10511: Signature validation failed" when trying to validate an Azure AD token尝试验证 Azure AD 令牌时出现错误“IDX10511:签名验证失败”
【发布时间】:2020-09-14 05:41:58
【问题描述】:

我有一个使用 oidc 向 Azure AD 进行身份验证的 Angular 10 应用程序。它成功获取令牌,然后对 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 字节前缀”的解决方法等,但都没有奏效。

我研究这个太久了,我的想法已经不多了。

请帮忙。

谢谢,

【问题讨论】:

    标签: angular wcf jwt azure-active-directory openid-connect


    【解决方案1】:

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

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

    【讨论】:

    • 我不知道为什么还没有人为此给予你信任,但这对我帮助很大。感谢您发布此内容。
    • 正是这个配置对我也有帮助(反应客户端)。干得好,谢谢你^^。我在这上面花了 2 天...
    猜你喜欢
    • 2021-09-10
    • 2017-05-19
    • 2019-11-19
    • 2020-05-29
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多