gpt4 book ai didi

asp.net - ASP .Net Core 在 JWTBearerOptions.Events OnTokenValidated 事件中访问 DistributedRedisCache

转载 作者:可可西里 更新时间:2023-11-01 11:15:54 25 4
gpt4 key购买 nike

我有一个 ASP .Net Core API 项目。在这个项目中,我使用 JWTBearer 身份验证。我还使用了 .Net Core 依赖注入(inject)的 AddDistributedRedisCache 功能。 (都显示在下面)

我们有时需要将 token 列入黑名单(管理员用户删除权限、注销等),以便这些 token 立即生效。本质上是强制用户在可以进行下一次调用之前重新登录。

我们将 JWT token 添加到 redis 缓存中,并在注销时将它们从客户端缓存中删除。但是用户可以(理论上)存储 JWT token ,并且在 token 过期之前仍然可以访问,除非我们拦截调用并根据黑名单检查它。

如何在下面的代码中访问“OnTokenValidated”事件中的分布式缓存对象?我每次都必须手动创建一个新连接吗?我们只检查有效 token ,因为这将阻止无效请求甚至被黑名单检查。

不记名 token 配置:

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");
});

最佳答案

您可以使用那里提供的 HttpContext 访问 DI 中的服务:

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

GetRequiredService如果找不到该服务,将抛出异常。您可以使用 GetService<T>()如果您希望该服务是可选的。

关于asp.net - ASP .Net Core 在 JWTBearerOptions.Events OnTokenValidated 事件中访问 DistributedRedisCache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48386946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com