【问题标题】:Set HttpContext.User for the session为会话设置 HttpContext.User
【发布时间】:2010-01-24 05:11:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net-mvc custom-authentication


    【解决方案1】:

    在 Global.asax 的 Application 类中编写如下方法

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

    或者您可以使用继承给您的控制器的 System.Web.Mvc.Controller 的“用户”属性(注意:当成功验证您的用户登录时,请务必调用 FormsAuthentication.SetAuthCookie 方法)。

    【讨论】:

    • .Net Core 中的这个等价物是什么?
    • 我在 .net 核心中也遇到了同样的问题。我尝试了很多天,但没有找到任何真正的解决方案。如果您找到任何解决方案,请告诉我。
    【解决方案2】:

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

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

    最后,这看起来是您不需要 ASP.NET 上的自定义授权属性,因为内置的 [Authorize] 属性应该自动与您的自定义身份验证模块一起使用。但是,您的 AccountController.LogOn() 方法(或您使用的任何替代方法)将需要与生成将由身份验证模块验证的令牌的适当身份验证提供程序进行通信。这应该是您唯一需要编写与内置提供的代码不同的代码的地方。

    请参阅http://social.msdn.microsoft.com/Search/en-US?query=http%20moduleshttp://social.msdn.microsoft.com/Search/en-US?query=custom%20authentication%20asp.net 了解更多信息。

    【讨论】: