我在ASP.NET MVC中实现了自定义身份验证。如果有效用户尝试登录,我在AccountController的Logon方法中设置HttpContext.User = user
。但它仍然存在只有请求。如何为会话设置它?
我使用了替代方案,设置了HttpContext.Session["CurrentUser"] = user
。如果我想查看会话是否已获得授权,我必须检查HttpContext.User != null
。但是,我不想在应用程序的任何地方公开身份验证逻辑。如果我需要改变它,那就太乱了。
请帮我解决这个问题。一个解决方案可能是在开头使用HttpContext.User
的值填充每个请求的HttpContext.Session["CurrentUser"]
属性,但我不知道该怎么做。
答案 0 :(得分:11)
在Global.asax的Application类
中编写以下方法protected void Application_BeginRequest(Object sender, EventArgs e)
{
HttpContext.Current.User = HttpContext.Session["CurrentUser"];
}
或者您可以使用继承到控制器的System.Web.Mvc.Controller的“User”属性(注意:确保在成功验证用户登录时调用FormsAuthentication.SetAuthCookie方法)。
答案 1 :(得分:6)
执行此操作的最佳方法是编写自定义身份验证模块并将其挂接到应用程序中。此模块将在任何请求之前执行,并且有机会根据需要设置HttpContext.User属性。
例如,考虑Forms Authentication模块。在HTTP处理程序运行之前(无论是.aspx页面,MVC管道等),它都有机会拦截请求。它读取登录cookie的值,解密并验证加密的cookie值,并在检查通过时设置HttpContext.User。这样,当处理程序运行并实际处理请求时,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。