我应该如何检查用户是否在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中想要使用的类。 例如,在代码隐藏页面中,您必须指定完全限定名称