我看过以下两种可访问的布尔值:
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")
}
}
上述任何一种方法都能同样有效吗?
答案 0 :(得分:65)
没有区别。唯一的区别是,如果用户未经过身份验证User.Identity
可能为空,因此您可能获得NRE,而使用第二种方法,内部则检查此更安全。
以下是Request.IsAuthenticated
方法的实现方式:
public bool IsAuthenticated
{
get
{
return this._context.User != null &&
this._context.User.Identity != null &&
this._context.User.Identity.IsAuthenticated;
}
}
基本上它比第一个更安全。
答案 1 :(得分:3)
IsAuthenticated属性,用于确定当前请求是否已通过身份验证。如果尚未通过身份验证,请求将重定向到另一个页面,用户可以在其中将凭据输入Web应用程序。这是应用程序默认页面中使用的常用技术。
但涉及User.Identity.IsAuthenticated
User属性提供对IPrincipal接口的属性和方法的编程访问。由于ASP.NET页面包含对System.Web命名空间(包含HttpContext类)的默认引用,因此您可以在.aspx页面上引用HttpContext的成员,而不使用对HttpContext的完全限定类引用。例如,您可以使用User.Identity.Name
获取当前进程正在其上运行的用户的名称。但是,如果要使用ASP.NET代码隐藏模块中的IPrincipal成员,则必须在模块中包含对System.Web命名空间的引用,并且必须包含对当前活动的请求/响应上下文的完全限定引用。您要使用的System.Web中的类。例如,在代码隐藏页面中,您必须指定完全限定名称
答案 2 :(得分:0)
根据达林·迪米特洛夫(Darin Dimitrov)的回答,您可以缩短代码并就地使用:
if( User?.Identity != null && User.Identity.IsAuthenticated )
{
//Code Goes Here!
}