【问题标题】:ASP .Net Core Access the DistributedRedisCache in the JWTBearerOptions.Events OnTokenValidated EventASP .Net Core 在 JWTBearerOptions.Events OnTokenValidated 事件中访问 DistributedRedisCache
【发布时间】: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


【解决方案1】:

您可以使用 DI 中可用的 HttpContext 访问服务:

OnTokenValidated = ctx =>
{
    var cache = ctx.HttpContext.RequestServices.GetRequiredService<IDistributedCache>();
    return Task.CompletedTask;
}

GetRequiredService 如果没有找到服务会抛出异常。如果您希望该服务是可选的,您可以使用GetService&lt;T&gt;()

【讨论】:

  • 啊,这是完美的伙伴,我会在早上试试谢谢!
猜你喜欢
  • 2020-04-17
  • 1970-01-01
  • 2020-08-12
  • 2021-11-05
  • 2017-03-13
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多