2010-01-24 60 views
7

我在ASP.NET MVC中實現了自定義身份驗證。如果有效用戶試圖登錄,我在AccountController的登錄方法中設置HttpContext.User = user。但它仍然只有請求。我該如何設置會話?爲會話設置HttpContext.User

我使用了替代方案,設置爲HttpContext.Session["CurrentUser"] = user。如果我想查看會話是否經過授權,那麼我必須檢查HttpContext.User != null。但是,我不想在應用程序的任何地方公開身份驗證邏輯。如果我需要改變這一點,那會很麻煩。

請幫我解決這個問題。一種解決方案可能是在開頭填充每個請求的HttpContext.User屬性的值爲HttpContext.Session["CurrentUser"],但我不知道該怎麼做。

回答

11

寫在Global.asax的應用類中的下列方法

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

,或者您可以使用繼承你的控制器(注System.Web.Mvc.Controller的「用戶」屬性:可以肯定的在成功驗證用戶登錄時調用FormsAuthentication.SetAuthCookie方法)。

+0

在'.Net Core'中這個等價物是什麼? – 2017-11-09 01:15:28

+0

我也堅持在.net核心的同樣的問題。我嘗試了很多天,但沒有找到任何真正的解決方案。如果您找到任何解決方案,請讓我知道。 – Saif 2018-02-08 07:37:52

6

做到這一點的最好方法是編寫一個自定義認證模塊並將其掛接到您的應用程序中。該模塊將在任何請求之前執行,並有機會根據需要設置HttpContext.User屬性。

例如,考慮Forms Authentication模塊。在您的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