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

Jos*_*eph 19 authentication asp.net-mvc authorization

我正在阅读ASP .NET MVC,我刚才谈到了Authorize属性.它说Authorize属性用于检查用户是否针对Controller进行了身份验证.这是真的?我知道该属性旨在用于授权目的,但使用此属性进行身份验证也是最佳做法吗?

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

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

Meh*_*ari 27

Authorize 属性可用于检查用户是否已登录.它还可用于检查用户是否是特定角色的成员并具有特定名称.

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

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

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

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

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

基本上,空[Authorize]属性执行授权,而不是身份验证.它不会检查你是谁.它只是检查您验证的那个人是否有权访问该资源.但是,其授权标准是"任何成功通过身份验证的人".您可以指定其他条件.所以,它确实在进行授权,而不是身份验证.


tva*_*son 5

授权确实检查用户是否已通过身份验证,否则将无法确定用户的角色或当前用户所在的用户(匿名用户除外).也就是说,为了获得授权,如果不允许匿名访问,则必须先进行身份验证.以下是RTM版本中AuthorizeCore方法的相关代码段(来自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;
    }

    ...
Run Code Online (Sandbox Code Playgroud)

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

编辑:读完你对其他答案的评论后,我会说你错过了这一点.从技术上讲,它只是在授权.一级授权,最低限度,是您需要进行身份验证才能执行操作.您可以通过不指定Authorize属性的任何用户或角色来实现此目的.只要经过身份验证,就允许任何用户或角色.通过指定充当过滤器的用户和/或角色,您可以缩小操作范围,并且不仅需要对用户进行身份验证(因此您可以检查名称/角色成员身份),还可以根据过滤器进行限定.