Angular 尝试验证Azure AD令牌时出现错误“IDX10511:签名验证失败”
我有一个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设置: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
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中的作用域中。这个值成为我的令牌中的受众,您可能需要验证您的令牌。我不知道为什么还没有人为此给您评分,但这对我帮助很大。谢谢你发这封信。我不知道为什么还没有人给你这封信,但是这封信帮了我很多忙。谢谢你发布这个。