【问题标题】:How should I check if a user is authenticated in MVC5?我应该如何检查用户是否在 MVC5 中经过身份验证?
【发布时间】:2013-09-30 06:34:17
【问题描述】:

我见过以下两个可访问的布尔值:

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

以上两种方法都一样好吗?

【问题讨论】:

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


    【解决方案1】:

    没有区别。唯一的区别是,如果用户未通过身份验证,User.Identity 可能为 null,因此您可能会获得 NRE,而使用第二种方法时,内部会对此进行检查并且更安全。

    Request.IsAuthenticated 方法的实现方式如下:

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

    基本上比第一个安全一点。

    【讨论】:

    • 如果上述测试通过,我想再做一个测试:“if (User.IsInRole("Admin")){ }”。可以将该测试包含在 Request.IsAuthenticated 中吗?
    • 我认为您不需要将测试包装在 Request.IsAuthenticated 中。拨打if ( User.IsInRole("Admin") ){ } 应该没问题。
    • @DarinDimitrov 我可以获取所有用户声明身份吗?
    • NRE 表示 NullReferenceException。
    【解决方案2】:

    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 中要使用的类。例如,在代码隐藏页面中,您必须指定完全限定名称

    【讨论】:

    • 如果尚未通过身份验证,则请求将重定向到另一个页面,用户可以在该页面中将其凭据输入 Web 应用程序...我不明白.. . 一个条件不能重定向客户端用户代理?!
    • User 属性提供对 IPrincipal 接口的属性和方法的编程访问。 ...接口不能实现属性!
    【解决方案3】:

    根据 Darin Dimitrov 的回答,您可以缩短代码并就地使用:

    if( User?.Identity != null && User.Identity.IsAuthenticated )
    { 
    //Code Goes Here!
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 2015-08-09
      相关资源
      最近更新 更多