【发布时间】: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