【发布时间】:2019-12-03 01:16:24
【问题描述】:
我正在使用如下身份验证。
TokenValidationParameters parameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = false,
ValidateLifetime = true,
ValidateActor = false,
ValidateAudience = false,
ValidateIssuer = false,
ValidateTokenReplay = false,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(...)),
ClockSkew = TimeSpan.Zero
};
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = parameters;
options.SecurityTokenValidators.Add(new SecurityTokenValidator());
});
我已经实现了 ISecurityTokenValidator (Microsoft.IdentityModel.Tokens) 并像这样覆盖了 ValidateToken 方法。
public ClaimsPrincipal ValidateToken(string securityToken,
TokenValidationParameters parameters,
out SecurityToken token)
{
IIdentity identity = new ClaimsIdentity(new[] { new Claim("name", "donkey") });
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
token = new JwtSecurityToken();
return principal;
}
代码之前授权正确,但现在,我指定了一个自定义验证器,我只得到 401 Unauthorized。很明显,我在这里做错了什么,主要嫌疑人是 token,即sparsely documented。
调试的时候,可以看到传入的token的内容,但是由于参数是out,所以不得不赋值,编译器拒绝配合。
- 验证失败是因为过期的令牌是虚拟的吗?
- 返回 bool 导致 401 出现的方法在哪里?
- 返回一组声明和经过验证的令牌有什么意义?
我一直在谷歌搜索,但未能找到这方面的具体信息。这一切都淹没在大量博客相互复制示例的噪音中(我可能不知道正确的搜索条件)。
有一些示例,例如 this 和 this,但由于复杂性,我不确定它是否适合遵循。其他人似乎只是在重用 JwtSecurityTokenHandler 的一个实例,这似乎不是我想要的自定义验证器。
【问题讨论】:
-
您使用的是哪个版本的 ASP.NET Core? Core 1 和 Core 2 的身份验证设计非常不同。另外,您是否遇到编译器错误或运行时问题?参数名称为
token,但您的代码示例正在分配validatedToken。 -
@Dai 添加了 Core 2.2 的标签并更正了错字(当我为更好的显示进行格式化时出错了)。
-
能否请您在
Startup课堂上发布您的AddAuthentication部分? -
另外,您使用的是哪个
ISecurityTokenValidator?它位于多个命名空间中,例如System.IdentityModel、Microsoft.IdentityModel等。 -
@Dai 好吧,我会被诅咒的 - 这是非常出乎意料的。否则我会在问题中提到这一点。它是 Microsoft.IdentityModel.Tokens;。我认为它们有所不同?
标签: c# authentication jwt claims-based-identity .net-core-2.2