中央服务将 IdentityServer 作为当前的身份验证方法,需要保持不变。
现在需要支持另一个 Jwt 不记名令牌。
似乎可以同时激活两种令牌样式,但我不确定何时运行身份验证检查,以及是否始终运行。顺序重要吗?如果其中一个失败会发生什么?
在调试新令牌期间,第一个块身份服务器身份验证被注释掉。
appBuilder.UseIdentityServerBearerTokenAuthentication(new
IdentityServerBearerTokenAuthenticationOptions
{
Authority = ...,
RequiredScopes = ...,
ValidationMode = ValidationMode.Both,
AutomaticRefreshInterval = ...,
ValidationResultCacheDuration = ...,
RequireHttps = ...
});
appBuilder.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
//AuthenticationType = DefaultAuthenticationTypes.ExternalBearer, // ???
AuthenticationMode = AuthenticationMode.Passive, // what is best???
AllowedAudiences = new[] { audience },
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(secret),
//ValidAudience = audience,
//ValidIssuer = issuer
}
});
当前的障碍是我们寻找 ClaimsPrincipal,所以有人可以建议在哪里创建和添加 ClaimsPrincipal 吗?
欲了解更多信息: 我们的授权检查是通过
AuthorizationFilterAttribute
实现的,请参阅下面的代码。
我们只看到默认的
WindowsPrincipal
包含 1 个匿名类型的 WindowsIdentities
public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
if (!(actionContext.RequestContext.Principal is ClaimsPrincipal principal) || !principal.Identity.IsAuthenticated)
{
// we exit here with an Unauthorized since above principal is not a of type ClaimsPrincipal
}
return Task.FromResult(true);
}
已解决。
问题是我们为
audience
和 issuer
配置的值被读取为空,并且对 appBuilder.UseJwtBearerAuthentication(
的调用似乎不喜欢那里的空值。
无需手动创建 ClaimsPrincipal - 一旦配置空值被修复,正确的类型就会自动出现在过滤器 actionContext 请求主体中。
关于主要问题是否应该像这样依次设置多个身份验证“提供者”?是的,经过测试,它可以使用 IdentityServer 令牌和新的 JwtBearer 令牌进行身份验证。
在这两种情况下,过滤器都会收到类型为
IsAuthenticated==true
的 ClaimsPrincipal
主体令牌。
这是新 Jwt 令牌的最终工作设置:
appBuilder.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
AllowedAudiences = new[] { audience },
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(secret),
ValidAudience = audience,
ValidIssuer = issuer
}
});