7

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

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

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

4

2 回答 2

11

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

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

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

于 2010-01-24T05:23:20.943 回答
6

最好的方法是编写一个自定义身份验证模块并将其挂接到您的应用程序中。该模块将在任何请求之前执行,并有机会根据需要设置 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了解更多信息。

于 2010-01-24T05:23:14.563 回答