【问题标题】:End Session after Blocking user and manually expire access token阻止用户后结束会话并手动使访问令牌过期
【发布时间】: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


【解决方案1】:

如果避免 db 调用是绝对必要的,我会将引导用户从应用程序的责任推到 Angular 端。请在下面查看我建议的使用 Web 套接字的流程。

  1. 管理员屏蔽用户,api 被用户屏蔽指令命中。这 api 将用户标记为在数据库中被阻止,并通过 websockets 将消息推送到 angular 应用程序(我会使用 信号 R 用于您的设置),其中包含用户 ID。
  2. Angular 应用程序检查从 api 发送的 userId 是否是所属的 到当前用户会话(可能是会话存储)。如果是这种情况启动 通过清除他的令牌并将他注销来退出用户。
  3. 如果用户尝试再次登录,只需移动检查以查看用户是否被阻止到您的登录方法,他/她将无法再次登录。

这是通过依靠您的套接字连接来引导用户将您所有的鸡蛋放在一个篮子里,但它取消了 api 上检查每个调用的责任,并将减少对您的数据库的喋喋不休。

【讨论】: