54

我已经看到以下两个可访问的布尔值:

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

上述任何一个都可以同样有效吗?

4

3 回答 3

71

没有区别。唯一的区别是,如果用户未通过身份验证,则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;
    }
}

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

于 2013-09-30T06:36:48.247 回答
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 中要使用的类。例如,在代码隐藏页面中,您必须指定完全限定名称

于 2013-09-30T06:39:22.930 回答
2

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

if( User?.Identity != null && User.Identity.IsAuthenticated )
{ 
//Code Goes Here!
}
于 2020-05-13T12:47:38.080 回答