【发布时间】:2025-12-16 06:10:01
【问题描述】:
我正在运行带有Angular 5 前端应用程序的ASP web API 应用程序,我正在使用ASP Identity 进行身份验证。
现在我的应用具有 blocking users 的功能,但由于我使用的是访问令牌,所以我无法尽快将用户注销除非我使用不好的做法(在问题的最后几行中提到),否则它们会被阻止。
在后端 API 应用程序中有一个 Verify 方法,它会检查访问令牌是否在来自 Angular 应用程序的每个服务调用中有效,当然这个用户被阻止时访问令牌不会更改,因此用户会继续访问,直到他的访问令牌过期。
克服这个问题的最佳做法是什么?
我正在使用的不好的做法:
Verify() {
var db = new ApplicationDbContext();
var user = db.users.Where(a => a.UserName == User.Identity.Name).FirstOrDefault();
if(!user.isActive) { return Ok("Blocked")}
else {
if (User.Identity.IsAuthenticated) { return Ok("Authorized"); }
else return Ok("Not Authorized");
}
}
但是函数Verify被调用了很多次,所以每次都搜索数据库并不是一个好的解决方案。
--> 为了阐明Angular应用中的注销,它首先从本地存储中清除访问令牌,然后重定向到登录页面,因此它与Web Api无关
--> 请告诉我是否需要在我的问题中澄清任何一点
【问题讨论】:
-
“函数Verify被调用了很多次,所以每次搜索数据库都不是一个好的解决方案”你可以将被阻塞的用户放在内存缓存中以减少在数据库调用。如果它们被暂时阻止,您可以将缓存的到期时间设置为阻止期限。
-
您也可以在您的令牌中存储某种 JWT 令牌 ID,并将此令牌的黑名单存储在内存中。
-
一般会强制执行多长时间?永久性 ?时间范围可能会影响对您问题的回答。
-
@stuartd 我认为Verify函数根本不应该调用数据库,并且阻塞取决于管理员,他随意更改用户状态,所以没有阻塞期,我的意思是现在至少
-
@cl0ud 阻塞取决于管理员,他随意更改用户状态,因此没有阻塞期
标签: c# asp.net asp.net-web-api asp.net-identity