接上一篇 接口权限验证文章
https://blog.youkuaiyun.com/qq_58734875/article/details/136580497?spm=1001.2014.3001.5501
在进行权限验证时,还需检查用户账号的状态,如是否被停用。如果账号被停用,应拒绝用户的访问请求。
可以在
Startup.cs
文件中的ConfigureServices
方法中找到对身份验证服务的配置,并在该方法内设置options.Events
。
//在这里处理验证成功后的逻辑
options.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
判断是否为超级管理员
using IServiceScope scope = context.HttpContext.RequestServices.CreateScope();
RedisContext _redisContext = scope.ServiceProvider.GetService<RedisContext>();
// 在这里处理验证成功后的逻辑
var userId = context.Principal.FindFirst(ClaimTypes.Sid)?.Value;
if (string.IsNullOrWhiteSpace(userId))
{
context.Fail("userid为空");
return Task.CompletedTask;
}
//判断用户是否被冻结
var key = GlobalConstants.REDIS_LOGIN + userId; // # 链接redis
//判断用户是否被冻结
using IServiceScope scope1 = context.HttpContext.RequestServices.CreateScope();
var database1 = _redisContext.GetCache<LoginRedis>(key);
if (database1 == null)
{
context.Fail("错误了");
}
return Task.CompletedTask;
},
//此处为权限验证失败后触发的事件
OnChallenge = context =>
{
//此处代码为终止.Net Core默认的返回类型和数据结果,这个很重要哦,必须
context.HandleResponse();
//自定义自己想要返回的数据结果,我这里要返回的是Json对象,通过引用Newtonsoft.Json库进行转换
var setting = new JsonSerializerSettings
{
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
};
var payload = JsonConvert.SerializeObject(ApiResult.error(ApplicationErrorCodeEnum.SYS_NOT_VALID_TOKEN), setting);
//自定义返回的数据类型
context.Response.ContentType = "application/json";
//自定义返回状态码,默认为401 我这里改成 200
context.Response.StatusCode = StatusCodes.Status200OK;
//context.Response.StatusCode = StatusCodes.Status401Unauthorized;
//输出Json数据结果
context.Response.WriteAsync(payload);
return Task.FromResult(0);
}
};