代码之家  ›  专栏  ›  技术社区  ›  Abdulsattar Mohammed

为会话设置httpContext.user

  •  7
  • Abdulsattar Mohammed  · 技术社区  · 15 年前

    我已经在ASP.NET MVC中实现了自定义身份验证。如果有效用户尝试登录,我将设置 HttpContext.User = user 在AccountController的登录方法中。但它只在那里 那个请求 . 如何为会话设置?

    我用了另一种方法 HttpContext.Session["CurrentUser"] = user . 如果我想看看会话是否被授权,我必须检查 HttpContext.User != null . 但是,我不想在应用程序的任何地方公开身份验证逻辑。如果我需要改变的话,会很混乱的。

    请帮我解决这个问题。一个解决方案是 HttpContext.User 每个请求的属性,值为 HttpContext.Session["CurrentUser"] 一开始,但我不知道怎么做。

    2 回复  |  直到 15 年前
        1
  •  11
  •   Alex LE    15 年前

    在global.asax的应用程序类中编写以下方法

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
       HttpContext.Current.User = HttpContext.Session["CurrentUser"];
    }
    

    或者,您可以使用继承到控制器的system.web.mvc.controller的“user”属性(注意:确保在成功验证用户登录时调用formsAuthentication.setAuthcookie方法)。

        2
  •  6
  •   Levi    15 年前

    实现这一点的最佳方法是编写一个自定义身份验证模块,并将其挂接到应用程序中。此模块将在任何请求之前执行,并有机会根据需要设置httpContext.user属性。

    例如,考虑窗体身份验证模块。在运行HTTP处理程序(无论是.aspx页、MVC管道等)之前,它有机会截获请求。它读取登录cookie的值,解密并验证加密的cookie值,如果检查通过,则设置httpContext.user。这样,当处理程序运行并实际处理请求时,用户属性已经被正确设置。

    最后,这看起来像是您不需要ASP.NET上的自定义授权属性,因为框中已经提供的[authorize]属性将自动与您的自定义身份验证模块一起工作。但是,您的accountController.logon()方法(或者您用来代替它的任何方法)将需要与生成将由身份验证模块验证的令牌的适当身份验证提供程序通信。这应该是唯一需要编写不同于框中提供的代码的地方。

    http://social.msdn.microsoft.com/Search/en-US?query=http%20modules http://social.msdn.microsoft.com/Search/en-US?query=custom%20authentication%20asp.net 更多信息。