66

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

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

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

4

6 回答 6

92

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

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

或者你可以根据组限制

[Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
    return View();
}
于 2012-06-01T09:56:14.360 回答
16

使用[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(通过archive.org)

于 2013-05-15T17:22:21.533 回答
11

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

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

于 2012-06-01T10:04:13.647 回答
8

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

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

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

于 2012-06-01T14:49:57.597 回答
6

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

如果您只是想阻止未登录的用户,但在您尝试基于角色应用授权以及您希望自定义处理未经授权的类型。

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

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

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

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

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

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

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

在 ASP.NET Core 中,您可以使用声明策略原则通过[Authorize].

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

[Authorize(Policy = "ElevatedRights")]

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

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

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

于 2018-07-26T09:43:04.450 回答
5

One advantage is that you are compiling access into the application, so it cannot accidentally be changed by someone modifying the Web.config.

This may not be an advantage to you, and might be a disadvantage. But for some kinds of access, it may be preferrable.

Plus, I find that authorization information in the Web.config pollutes it, and makes it harder to find things. So in some ways its preference, in others there is no other way to do it.

于 2012-06-01T20:36:10.573 回答