【问题标题】:Invalidating ASP.NET FormsAuthentication server side使 ASP.NET FormsAuthentication 服务器端无效
【发布时间】:2010-05-23 20:32:33
【问题描述】:

我正在试验 FormsAuthentication(使用 ASP.NET MVC2),它运行良好。

但是,我不知道如何处理的一种情况是验证服务器上的用户身份,以确保从服务器的角度来看它仍然有效。

例如。

  1. 用户登录 ... 获取 cookie/票证
  2. 带外用户在服务器端被删除
  3. 用户向服务器发出新请求。 HttpContext.User.Identity.Name 设置为已删除的用户。

我可以检测这很好,但正确的处理方法是什么?在OnActionExecuting 事件上的OnAuthorization 中调用FormsAuthentication.SignOut 来不及影响当前请求。

或者,我希望能够在删除(或重新创建数据库)用户时调用 FormsAuthentication.InvalidateUser(...) 以使给定(或所有)用户的所有票证无效。但我找不到执行此操作的 API。

【问题讨论】:

    标签: asp.net forms-authentication


    【解决方案1】:

    在 global.asax 中,为 AuthenticateRequest 添加一个处理程序。在这种方法中,表单身份验证已经发生,您可以在其他任何事情发生之前随意修改当前主体。

    protected void Application_AuthenticateRequest(object sender, EventArgs e) {
      IPrincipal principal = HttpContext.Current.User;
      if (!UserStillValid(principal)) {
        IPrincipal anonymousPrincipal = new GenericPrincipal(new GenericIdentity(String.Empty), null);
        Thread.CurrentPrincipal = anonymousPrincipal;
        HttpContext.Current.User = anonymousPrincipal;
      }     
    }
    

    只需实现UserStillValid 方法就可以了。如果需要,它也是一个用自定义主体交换通用主体的好地方。

    【讨论】:

    • UserStillValid 函数将检查用户是否在数据库中处于活动状态? Thread.CurrentPrincipal = anonymousPrincipal 和 HttpContext.Current.User = anonymousPrincipal 是什么意思;
    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 2011-05-16
    • 2011-12-05
    • 1970-01-01
    • 2013-10-10
    • 2011-01-01
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多