ASP.NET MVC 中的授权属性

Posted

技术标签:

【中文标题】ASP.NET MVC 中的授权属性【英文标题】:Authorize attribute in ASP.NET MVC 【发布时间】:2018-11-23 00:06:43 【问题描述】:

我很难理解 ASP.NET MVC 中[Authorize] 属性的实际用途。按照这个概念,如果我们用[Authorize] 属性装饰控制器方法,则只有经过身份验证的用户才能访问控制器。

我开发了一个 ASP.NET MVC 应用程序,没有使用[Authorize] 属性装饰控制器。我观察到的是,如果我使用 web.config 或其他方式在我的应用程序中正确实现身份验证机制,则现在我可以访问特定操作方法的 URL controller/action/id

系统总是要求登录。这意味着我的控制器是安全的。我的问题是,当我可以在不使用[Authorize] 属性的情况下保护我的控制器时,它的真正需要是什么?

【问题讨论】:

【参考方案1】:

真正的力量来自于理解和实施成员提供者以及角色提供者。您可以将用户分配到角色中,并且根据该限制,您可以将不同用户的不同访问角色应用于控制器操作或控制器本身。

 [Authorize(Users = "Betty, Johnny")]
 public ActionResult SpecificUserOnly()
 
     return View();
 

或者你可以根据组来限制

[Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()

    return View();

【讨论】:

感谢您的回答。但同样的限制,我可以使用我的 web.config 对控制器返回的视图页面使用成员资格和角色提供程序。我不需要为此使用 [Authosrize] 属性。 @kaus - 需要指出的一点是,在 MVC 应用程序中使用 web.config 可能存在安全漏洞。 authorize 属性考虑了所有 ASP.NET 路由,而使用 web.config,您必须知道应用程序中所有可能的路由配置并将其考虑在内。您可能已经考虑到了这一切,但您无法通过查看 web.config 和 routing.config 以及您查看的其他任何地方来确定。通过查看类的 Authorize 属性,您知道无论路由如何,它都是安全的。【参考方案2】:

使用[Authorize] 属性有助于防止应用程序中的安全漏洞。 MVC 处理 URL 的方式(即将它们路由到控制器而不是实际文件)使得通过 web.config 文件实际保护所有内容变得困难。

在此处阅读更多信息:http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx (via archive.org)

【讨论】:

【参考方案3】:

它的存在是因为它使用起来更方便,也是一种完全不同的思想,使用属性来标记授权参数而不是xml配置。它并不是要击败通用配置或任何其他授权框架,只是 MVC 的做法。我这么说是因为您似乎正在寻找一种技术功能优势,这些优势可能不是……只是极好的便利性。

BobRock 已经列出了优势。只是为了补充他的答案,另一个场景是您可以将此属性应用于整个控制器,而不仅仅是动作,您还可以将不同的角色授权参数添加到同一控制器中的不同动作以进行混合和匹配。

【讨论】:

【参考方案4】:

使用Authorize 属性似乎更方便,感觉更'MVC方式'。至于技术优势还是有的。

我想到的一个场景是当您在应用程序中使用输出缓存时。授权属性处理得很好。

另一个是可扩展性。 Authorize 属性只是开箱即用的基本过滤器,但您可以覆盖其方法并执行一些预授权操作,例如日志记录等。我不确定您将如何通过配置来做到这一点。

【讨论】:

+1 用于提及可扩展性。与 web.config 方法相比,这是一个明显的优势。 ;)【参考方案5】:

web.config 中的标签基于路径,而 MVC 与控制器操作和路由一起使用。

如果您只是想阻止未登录的用户,但在您尝试基于角色应用授权时以及在您想要的情况下,这可能不会产生很大的不同,这是一个架构决策。 Unauthorized 类型的自定义处理。

BobRock 的回答涵盖了第一种情况。

用户应至少具有以下角色之一才能访问控制器或操作

[Authorize(Roles = "Admin, Super User")]

用户应该同时拥有这两个角色才能访问控制器或操作

[Authorize(Roles = "Super User")]
[Authorize(Roles = "Admin")]

可以访问 Controller 或 Action 的用户是 Betty 和 Johnny

[Authorize(Users = "Betty, Johnny")]

在 ASP.NET Core 中,您可以使用Claims 和Policy 原则通过[Authorize] 进行授权。

options.AddPolicy("ElevatedRights", policy =>
                  policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));

[Authorize(Policy = "ElevatedRights")]

第二个在更大的应用程序中非常方便,在这些应用程序中,授权可能需要根据情况使用不同的限制、流程和处理来实现。出于这个原因,我们可以Extend AuthorizeAttribute 并为我们的项目实施不同的授权替代方案。

public class CustomAuthorizeAttribute: AuthorizeAttribute  
  
    public override void OnAuthorization(AuthorizationContext filterContext)  
      

在 ASP.NET MVC 中进行授权的“正确完成”方式是使用[Authorize] 属性。

【讨论】:

【参考方案6】:

一个优点是您正在编译对应用程序的访问,因此它不会被修改 Web.config 的人意外更改。

这对您来说可能不是优势,也可能是劣势。但对于某些类型的访问,它可能是更可取的。

另外,我发现 Web.config 中的授权信息会污染它,使查找内容变得更加困难。所以在某些方面它的偏好,在其他方面没有其他方法可以做到这一点。

【讨论】:

以上是关于ASP.NET MVC 中的授权属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在asp.net mvc 5身份中的授权属性中使用动态角色

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

ASP.NET MVC 表单身份验证 + 授权属性 + 简单角色

带有参数的 ASP.NET MVC 授权属性

带有权限代码的 ASP.NET MVC 4 自定义授权属性(无角色)

ASP.NET MVC 角色授权