ASP .NET MVC 中的 Authorize 属性是不是用于身份验证和授权?

Posted

技术标签:

【中文标题】ASP .NET MVC 中的 Authorize 属性是不是用于身份验证和授权?【英文标题】:Is the Authorize attribute in ASP .NET MVC used for Authentication as well as Authorization?ASP .NET MVC 中的 Authorize 属性是否用于身份验证和授权? 【发布时间】:2010-11-01 11:59:50 【问题描述】:

我正在阅读有关 ASP .NET MVC 的内容,我刚刚进入了有关 Authorize 属性的部分。就是说 Authorize 属性用于检查用户是否通过了控制器的身份验证。这是真的?我知道该属性旨在用于授权目的,但使用此属性进行身份验证也是最佳实践吗?

如果不是,验证(不执行)身份验证的最佳做法是什么?

如果是这样,为什么要这样做?我错过了什么吗?

【问题讨论】:

只是措辞不佳的文档?您正在授权经过身份验证的用户或“授权”匿名用户。 永远无法授权匿名用户。只有经过身份验证的用户才能获得授权。首先是登录(身份验证),然后是授权(权限检查)。 【参考方案1】:

身份验证和授权是两个不同的问题。

身份验证验证用户是他所说的那个人,在大多数网络应用程序中几乎总是通过验证他/她是否有一些只有他/她应该知道的知识(如密码)来完成。

授权验证经过身份验证的用户是否有权限做某事。例如,只有管理员可以访问管理页面。

由于我们只能在登录后获取一个人的角色,因此可以使用 Authorize 属性来测试身份验证。

看看这篇博文,看看作者是如何实现自定义 Authorize 和 Authentication 属性的:

Securing your controller actions

您会看到 Authorize 属性必须检查身份验证,因为只有经过身份验证的用户才能拥有角色。

【讨论】:

我了解身份验证和授权是不同的问题。困扰我的是一个单一的属性(授权)被用来检查两个问题。这就是我的问题的本质。【参考方案2】:

Authorize属性可以用来检查用户是否登录。它也可以用来检查用户是否是特定角色的成员并且具有特定的名称。

在使用 Web 表单时,它基本上与 web.config 中的 <authorization> 部分处理的事情相同。

它没有指定身份验证方法。它由web.config 中的<authentication> 部分处理,就像Web 表单一样。

编辑(关于身份验证和授权的说明):

身份验证是身份验证。也就是说,您检查用户是谁。这可以通过检查用户名和密码、检查您的 Windows 身份验证令牌、扫描视网膜、语音识别或其他任何方式来执行。

授权是限制满足特定条件的用户访问特定资源的行为。为了能够授权用户访问资源,您应该知道用户拥有的权限。要检查这一点,您首先应该知道用户是谁。所以必须对用户进行身份验证。

本质上是一个空的[Authorize] 属性进行授权,而不是身份验证。它不会检查你是谁。它只是检查您验证的人是否有权访问该资源。但是,它的授权标准是“任何成功通过身份验证的人”。您可以指定不同的标准。所以,它确实是在做授权,而不是身份验证。

【讨论】:

我担心一个属性被用于跟踪 A. 用户是否被授权和 B. 用户是否通过身份验证是不是错了? 一个简单的 [Authorize] 将检查是否已通过身份验证。 [Authorize(Role=...)] 之类的东西也会检查角色和其他东西。 我理解实现。我想知道为什么没有 [Authenticate] 而不是使用 [Authorize] (检查用户是否经过身份验证)。 不,没有[Authenticate][Authorize] 处理这个问题。其实在 ASP.NET Web 表单中,也是由<authroization> <deny users="?" /> <allow users="*" /> </authorization>处理的。【参考方案3】:

Authorize 确实会检查用户是否经过身份验证,否则它将无法确定用户的角色或当前用户是哪个用户(匿名用户除外)。也就是说,为了获得授权,如果不允许匿名访问,则必须先进行身份验证。下面是 RTM 版本中 AuthorizeCore 方法的相关 sn-p(来自http://www.codeplex.com/aspnet)。

// This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method.
protected virtual bool AuthorizeCore(HttpContextBase httpContext) 
    if (httpContext == null) 
        throw new ArgumentNullException("httpContext");
    

    IPrincipal user = httpContext.User;
    if (!user.Identity.IsAuthenticated) 
        return false;
    

    ...

如果 AuthorizeCore 在 OnAuthorization 中返回 false,则 AuthorizationContext.Result 设置为新的 HttpUnauthorizedResult,这将导致用户被重定向到登录页面(在 FormsAuthentication 中)或错误。

编辑:在阅读了您的 cmets 到其他答案之后,我想说您没有抓住重点。从技术上讲,它只是在做授权。最低级别的授权是您需要经过身份验证才能执行操作。您可以通过不为 Authorize 属性指定任何用户或角色来获得此信息。允许任何用户或角色,只要它经过身份验证。通过指定充当过滤器的用户和/或角色,您可以缩小操作的范围,并且用户不仅需要经过身份验证(以便您可以检查名称/角色成员资格),还需要根据过滤器获得资格。

【讨论】:

以上是关于ASP .NET MVC 中的 Authorize 属性是不是用于身份验证和授权?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 用多个枚举装饰 [Authorize()]

将 [Authorize] 添加到控制器无法重定向到身份登录路由。 ASP.NET 核心 3.1 MVC

为啥 [Authorize(Roles = "Admin")] 不能在具有 ASP.NET 标识的 MVC 5 RTM 中工作?

ASP.NET Core MVC 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide

MVC 3 ASP.NET 角色-授权属性

使用身份验证 ASP.NET MVC 中的用户