如何在 MVC ASP.NET 维护有关用户是否在整个页面中“登录”的信息

本文关键字:登录 信息 是否 ASP MVC NET 维护 用户 | 更新日期: 2023-09-27 18:36:24

在他们输入密码后,我应该在服务器会话存储中保留一个变量,就像我在向需要登录的页面发出请求时检查Session["loggedIn"] = true,还是有更好/更安全的方法传统上在 ASP.NET 中完成?

如何在 MVC ASP.NET 维护有关用户是否在整个页面中“登录”的信息

不,不要将其保留在会话变量中。事实上,我认为你应该尽量不要将会话用于任何事情。尽量保持 HTTP 通信无状态。

对于 MVC ASP.NET 身份验证,您有两种选择,但最终,两者的工作方式相同:在您成功登录用户后将加密的身份验证 cookie 写入浏览器。

在对OP的评论中提到了较新的替代方案:Microsoft.AspNet.Identity。要使用它,您应该使用带有 OWIN 管道的较新版本的 ASP.NET MVC(尽管我不确定您是否必须这样做)。较旧的替代方案称为表单身份验证,我相信可以与除版本 6(新的 vNext/core 1.0 内容)之外的任何版本的 MVC 一起使用。

成功将这两个工具之一集成到 MVC 应用程序中后,用户登录后,Controller将具有 IPrincipal 类型的非空 User 属性。可以使用此属性来确定用户是否经过身份验证:

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

如果您使用的是较新的 Microsoft.AspNet.Identity,则此IPrincipal User属性将作为具有一个或多个ClaimsIdentityClaimsPrincipal实现。Forms 身份验证不会执行此类声明,因此,如果需要声明或社交登录等,请使用 Microsoft.AspNet.Identity。

传统上在 ASP.NET 中完成此操作的方式,在我看来也更好,更安全,方法是使用 ASP.NET Identity包。

ASP.NET 标识处理 Web 应用程序中有关用户帐户的所有方面:

  • 用户数据库,包括角色等
  • 用户注册和管理,如注册、电子邮件验证、登录、记住我选项、忘记密码操作等。
  • 用户身份验证和授权

为了更清楚地说明,身份验证意味着发出请求的用户实际上是有效的应用程序用户,授权意味着用户有权执行请求的操作。

实际上,当用户登录时,Identity 会自动保留该信息,并使其在User属性下的所有控制器和视图中可用。因此,您可以随时知道哪个用户发出了请求。标识还为每个请求提供用于用户身份验证和授权的 Cookie。

要检查用户身份验证,请在视图中使用 User.Identity.IsAuthenticated,在控制器中使用 Authorize 属性:

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

上述对 Authorize 属性的使用将仅允许注册用户请求此页面。

扩展应用程序的功能以包括用户角色和用户授权也很常见。标识创建一个"用户"表、一个"角色"表以及它们之间的多对多关系。为用户分配角色后,您可以通过在视图控制器中使用User.Identity.IsInRole("YourRoleName")来授权他们的请求:

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

上述 Authorize 属性的使用将仅允许具有"您的角色名称"角色的注册用户请求此页面。在任何情况下,如果Identity未能进行身份验证或授权,请求将提示到登录页面。

ASP.NET Identity 易于使用,它工作正常,并且很容易扩展应用程序的成员资格功能,方法是使用它提供的许多工具并重写其类以赋予它们更具体或更复杂的行为。

您将在网络上找到有关如何使用它的无限帮助或分步指南。