我应该如何检查用户是否在MVC5中进行身份validation?

我看到以下两个可用的布尔值:

  • System.Web.Mvc.Controller.User.Identity.IsAuthenticated
  • System.Web.Mvc.Controller.Request.IsAuthenticated

这些有区别吗? 他们都似乎做同样的事情,所以我不知道要使用。

我想要做的是:

 @if (User.Identity.IsAuthenticated) { if (User.IsInRole("Admin")) { @Html.ActionLink("Admin", "AdminController") } } 

要么

 @if (Request.IsAuthenticated) { if (User.IsInRole("Admin")) { @Html.ActionLink("Admin", "AdminController") } } 

上述任何一项工作是否同样好?

没有区别。 唯一的区别是,如果用户没有通过身份validationUser.Identity可能是空的,因此你可能会得到一个NRE,而第二种方法,内部有一个这样的检查,更安全。

以下是如何实现Request.IsAuthenticated方法:

 public bool IsAuthenticated { get { return this._context.User != null && this._context.User.Identity != null && this._context.User.Identity.IsAuthenticated; } } 

基本上比第一个更安全。

IsAuthenticated属性确定当前的请求是否已被authentication。 如果没有通过身份validation,请求将被redirect到另一个页面,用户可以在其中input凭据到Web应用程序中。 这是在应用程序的默认页面中使用的常用技术。

但是当涉及到User.Identity.IsAuthenticated

User属性提供对IPrincipal接口的属性和方法的编程访问。 由于ASP.NET页面包含System.Web命名空间(包含HttpContext类)的默认引用,因此可以在.aspx页面上引用HttpContext的成员,而不使用对HttpContext的完全限定类引用。 例如,可以使用User.Identity.Name来获取当前进程正在运行的用户的名称。 但是,如果要使用ASP.NET代码隐藏模块中的IPrincipal成员,则必须在模块中包含对System.Web命名空间的引用,以及对当前活动的请求/响应上下文和System.Web中想要使用的类。 例如,在代码隐藏页面中,您必须指定完全限定名称