阻止用户后结束会话并手动使访问令牌过期

End Session after Blocking user and manually expire access token

我是 运行 一个带有 Angular 5 前端应用程序的 ASP web API 应用程序,我正在使用 ASP Identity 进行身份验证。

现在我的应用程序具有 阻止用户 的功能,但是由于我正在使用访问令牌,所以我找不到除非我使用不良做法(在问题的最后几行中提到),否则在用户被阻止后立即将其注销的方法。

后端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

--> 如果我的问题中有任何一点需要澄清,请告诉我

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

  1. 管理员阻止了用户,api 被用户的阻止指令击中。这 api 将用户标记为在数据库中被阻止并通过 websockets 将消息向下推送到 angular 应用程序(我会使用 signal R for your setup),其中包含 userId。
  2. angular 应用程序检查从 api 发送的 userId 是否属于 到当前用户会话(可能是会话存储)。如果是这种情况,请启动 通过清除他的令牌并注销他来退出用户。
  3. 如果用户尝试再次登录,只需移动检查以查看用户是否被阻止使用您的登录方法,he/she 将不再能够再次登录。

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