簡體   English   中英

如何在ASP.NET MVC中維護有關用戶是否在整個頁面中“登錄”的信息?

[英]How in ASP.NET MVC do I maintain info about whether a user is “logged in” throughout pages?

在他們輸入密碼之后,我應該在服務器會話存儲中保留一個變量,例如Session["loggedIn"] = true ,以檢查何時對需要登錄的頁面進行請求,或者是否有傳統上更好/更安全的方式在ASP.NET中完成?

不,請勿將此保留在會話變量中。 實際上,我認為您不應嘗試將session用於任何東西 嘗試使HTTP通信盡可能保持無狀態。

對於ASP.NET MVC中的身份驗證,您有2種選擇,但是最終,兩種選擇都以相同的方式工作:在成功登錄用戶后,將加密的身份驗證cookie寫入瀏覽器。

在OP的注釋中提到了較新的替代方法: Microsoft.AspNet.Identity 若要使用此功能,您應該使用帶有OWIN管道的ASP.NET MVC的較新版本(盡管我不確定是否必須這樣做)。 我相信,較舊的替代方法稱為“ 表單身份驗證” ,並且可以與MVC以外的任何版本(版本6(新的vNext / core 1.0東西)一起使用)一起使用。

當您成功將這兩個工具之一集成到MVC應用程序中時,在用戶登錄后,您的Controller將具有類型為IPrincipal的非null User屬性。 您可以使用此屬性來確定用戶是否已通過身份驗證:

// in a controller
bool isThereAUserLoggedIn = this.User != null && this.User.Identity.IsAuthenticated;

如果您使用的是較新的Microsoft.AspNet.Identity,那么這個IPrincipal User屬性將被實現為ClaimsPrincipal與一個或多個ClaimsIdentity秒。 表單身份驗證不會執行此類聲明,因此,如果您要聲明或社交登錄等,請使用Microsoft.AspNet.Identity。

傳統上,這是在ASP.NET中完成的,並且我認為更好,更安全的方式是使用ASP.NET Identity包。

ASP.NET Identity處理Web應用程序中有關用戶帳戶的所有方面:

  • 用戶數據庫,包括角色等
  • 用戶注冊和管理,例如注冊,電子郵件驗證,登錄,“記住我”選項,“忘記密碼”操作等等。
  • 用戶認證和授權

為了使事情更加清楚, 身份驗證意味着發出請求的用戶實際上是有效的應用程序用戶,而授權意味着該用戶有權執行所請求的操作。

實際上,當用戶登錄時,Identity會自動保留該信息,並使其在User屬性下的所有控制器和視圖中可用。 因此,您隨時可以知道哪個用戶發出了請求。 身份還向每個請求提供一個用於用戶身份驗證和授權的cookie。

要檢查用戶身份驗證,可以在視圖中使用User.Identity.IsAuthenticated ,在控制器中使用Authorize屬性:

[Authorize]
public ActionResult Create( ... ){ ... }

上面對Authorize屬性的使用將僅允許注冊用戶請求此頁面。

擴展應用程序的功能以包括用戶角色和用戶授權也很常見。 身份創建一個“用戶”表,一個“角色”表以及它們之間的多對多關系。 在為用戶分配角色后,您可以通過在視圖控制器中使用User.Identity.IsInRole("YourRoleName")來授權他們的請求:

[Authorize("YourRoleName")]
public ActionResult Create( ... ){ ... }

上面對Authorize屬性的使用將僅允許具有“ YourRoleName”角色的注冊用戶請求此頁面。 在任何情況下,如果Identity未能通過身份驗證或授權,請求都將提示登錄頁面。

ASP.NET Identity使用簡單,有效並且可以輕松擴展應用程序的成員資格功能,這既可以通過使用其隨附的許多工具來實現,也可以通過覆蓋其類以使其具有更具體或更復雜的行為來進行。

您將在網上找到有關如何使用它的無窮幫助,或者逐步指南。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM