在ASP.NET MVC中授权属性

时间:2012-06-01 09:52:13

标签: asp.net-mvc-3

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

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

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

6 个答案:

答案 0 :(得分:85)

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

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

或者您可以根据群组进行限制

[Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
    return View();
}

答案 1 :(得分:13)

使用[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

答案 2 :(得分:10)

它的存在是因为它使用起来更方便,也是一种完全不同的意识形态,使用属性来标记授权参数而不是xml配置。它并不意味着击败通用配置或任何其他授权框架,只是MVC的方式。我这样说,因为看起来你正在寻找技术特性优势,这可能不是......只是极好的便利性。

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

答案 3 :(得分:8)

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

我想到的一个场景是您在应用中使用输出缓存。授权属性句柄。

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

答案 4 :(得分:4)

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

这对您来说可能不是一个优势,也可能是一个缺点。但对于某些类型的访问,它可能是首选。

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

答案 5 :(得分:2)

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

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

第一种情况是BobRock的回答。

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

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

用户应该同时具有这两个角色,才能访问Controller或Action

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

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

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

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

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

[Authorize(Policy = "ElevatedRights")]

第二种方法在较大的应用程序中非常方便,在较大的应用程序中,可能需要根据情况在不同的限制,过程和处理方式下实施授权。因此,我们可以Extend AuthorizeAttribute并为我们的项目实现不同的授权替代方案。

public class CustomAuthorizeAttribute: AuthorizeAttribute  
{  
    public override voidOnAuthorization(AuthorizationContextfilterContext)  
    {  }
}

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