【发布时间】:2018-07-01 09:37:12
【问题描述】:
我有一个 ASP .Net Core API 项目。在这个项目中,我使用 JWTBearer 身份验证。我还在使用 .Net Core Dependency Injection 的 AddDistributedRedisCache 功能。 (下图)
我们有时需要将令牌列入黑名单(管理员用户删除权限、注销等),以便这些令牌立即生效。本质上是强制用户在下一次调用之前重新登录。
我们正在将 JWT 令牌添加到 redis 缓存中,并在注销时将它们从客户端缓存中删除。但是用户可以(理论上)存储 JWT 令牌,并且在令牌过期之前仍然可以访问,除非我们拦截调用并将其与黑名单进行检查。
如何在下面代码的“OnTokenValidated”事件中访问分布式缓存对象?我每次都必须手动创建一个新连接吗?我们只检查有效令牌,因为这将阻止无效请求甚至被黑名单检查。
承载令牌配置:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "localhost:5000",
ValidAudience = "localhost:5000",
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(Configuration.GetValue<string>("SigningKey"))),
};
options.Events = new JwtBearerEvents
{
OnTokenValidated = context => {
//context.Fail("User has been logged out");
return Task.CompletedTask;
}
};
});
Redis 缓存配置:
services.AddDistributedRedisCache(option =>
{
option.Configuration = Configuration.GetValue<string>("RedisCacheAddress");
option.InstanceName = Configuration.GetValue<string>("RedisCacheInstance");
});
【问题讨论】:
-
我正在做同样的事情。您能否分享一下您如何从 Redis 验证 JWT 令牌或任何有关此的文章?
-
对于这个例子(大约是 4 年前,在我的上一份工作中),我想我确实拿走了整个 jwt 令牌的 MD5(如果它被列入黑名单 - 即注销,或者用户禁用等..),然后将 MD5 转储到 redis 大约 24 小时,比令牌的有效期长...所以当我检查令牌是否有效时,我可以做一个快速的 md5 哈希,试试并从 redis 获取,如果它被列入黑名单,我会受到打击,我可以拒绝访问。
-
感谢您的回复。我正在使用多种缓存机制,并且正在使用我自己的接口。所以我像这样处理它 var cache = ctx.HttpContext.RequestServices.GetRequiredService
(); var cachedValue = cache.GetCacheValue ("MYTOKENKEY")); if (string.IsNullOrEmpty(cachedValue) || cachedValue != currentToken) {throw new Exception.ValidationException("Invalid Token!");} Like @juunas answer.
标签: asp.net asp.net-core redis .net-core jwt