使用 IdentityServer 和另一个 JwtBearer 令牌进行身份验证

问题描述 投票:0回答:1

中央服务将 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);
}
asp.net identityserver4 owin claims-based-identity bearer-token
1个回答
0
投票

已解决。

问题是我们为

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
    }

});
© www.soinside.com 2019 - 2024. All rights reserved.