Angular 尝试验证Azure AD令牌时出现错误“IDX10511:签名验证失败”

Angular 尝试验证Azure AD令牌时出现错误“IDX10511:签名验证失败”,angular,wcf,jwt,azure-active-directory,openid-connect,Angular,Wcf,Jwt,Azure Active Directory,Openid Connect,我有一个Angular 10应用程序,它使用oidc与Azure AD进行身份验证。它成功获取令牌,然后对WCF服务进行REST调用。net framework 4.7发送它从Azure收到的令牌。WCF服务中的验证代码失败,出现以下错误: IDX10511:签名验证失败。尝试的键:“System.Text.StringBuilder”。孩子:“System.String”。捕获到异常:“System.Text.StringBuilder”。token:'System.IdentityModel

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

如果我使用Auth0进行身份验证,那么相同的WCF代码能够从Auth0验证jwt,而不会出现错误

以下是我的oidc客户端的UserManager设置:

          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.ValidateTokentoken、validationParameters、out securityToken

我尝试了各种在线建议,在Azure中添加了一个作用域,解决了0字节前缀的问题,等等,但都不起作用

我在这个问题上做得太久了,现在已经没有什么想法了

请帮忙


谢谢,

我正在发布这篇文章,以防对其他人有所帮助


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

我将发布此值,以防它会帮助其他人


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

我不知道为什么还没有人为此给您评分,但这对我帮助很大。谢谢你发这封信。我不知道为什么还没有人给你这封信,但是这封信帮了我很多忙。谢谢你发布这个。