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

时间:2013-09-30 06:34:17

标签: c# asp.net-mvc authentication principal

我看过以下两种可访问的布尔值:

  • 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")        
  }
}

上述任何一种方法都能同样有效吗?

3 个答案:

答案 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!
}