asp .net mvc授权

时间:2009-07-15 02:01:34

标签: asp.net-mvc membership

在asp .net mvc中保护Web应用程序某些区域的最佳方法是什么?我知道我们可以在每个动作中加上[Authorization]属性,但这似乎非常繁琐,因为你必须把它全部放在一起。我正在使用成员资格提供程序,并通过基于该文件夹设置此保护来尝试我以前在回发模型中的方式。我使用web.config <location>部分来保护一些文件夹。我在mvc中尝试了这个,它似乎正在工作,但大多数教程都使用[Authorization]方式。

哪一个是更好的方法?

5 个答案:

答案 0 :(得分:5)

我强烈建议不要将它放在web.config中。实际上,Conery,Hanselman,Haack和Guthrie也是如此 - 尽管不是很高(专业ASP.NET MVC 1.0的第223页)

路由可能会发生变化,尤其是在MVC中。使用WebForm模型,路由在文件系统上实际表示,因此您不必担心它。在MVC中,由于缺乏更好的术语,路线是“动态的”。

最终可能会有多个路由映射到一个控制器,从而导致web.config中的维护工作变得很麻烦。更糟糕的是,您可能无意中让路由意外地调用了控制器,或者在添加/修改路由后忘记更新web.config并让自己保持打开状态。

但是,如果您保护控制器而不是实际路由,那么您无需担心web.config与控制器的运行和更改路由保持同步。

只需2美分。

答案 1 :(得分:4)

一种可能的解决方案是创建一个“受保护的控制器”,并将其用作您要保护的应用程序所有区域的基类

[Authorize]
public class ProtectedBaseController : Controller { 

}

public class AdminController : ProtectedBaseController { 
  ...
}

public class Admin2Controller : ProtectedBaseController { 
  ...
}

答案 2 :(得分:3)

将[Authorization]放在控制器类的顶部。这将锁定整个控制器的动作。

答案 3 :(得分:0)

您可以将[授权]放到您需要保护的每个控制器上。

您可以添加过滤器GlobalFilters.Add(new AuthorizeAttribute());在您的Startup.cs(或Global.asax)中,将[AllowAnonymus]属性放入您允许非注册用户使用的任何控制器或操作。

如果您选择将[授权]放入每个安全控制器,您需要确保您或团队中的任何其他人添加的任何控制器都是安全的。对于这个要求,我使用这样的测试:

[Fact]
public void AllAuth()
{
    var asm = Assembly.GetAssembly(typeof (HomeController));
    foreach (var type in asm.GetTypes())
    {
        if (typeof(Controller).IsAssignableFrom(type))
        {
            var attrs = type.GetCustomAttributes(typeof (AuthorizeAttribute));
            Assert.True(attrs.Any());
        }
    }
}

我认为这种方式比创建ProtectedContoller更好,因为它不能保证您的系统安全地拥有所有控制器。这种方式也不使用继承,这会使项目更重。

答案 4 :(得分:0)

授权是保护应用程序安全的一种方法;将属性应用于每个控制器。 另一种方法是在登录和注册操作上使用新的 AllowAnonymous 属性。 根据当前区域做出安全决策是一件很糟糕的事情,这会使您的应用程序容易受到攻击。

您可以获得here

的代码

由于ASP.NET MVC 4包含新的AllowAnonymous属性,因此您无需再编写该代码。
在global.asax中全局设置AuthorizeAttribute之后,将其列入白名单即可。 您想要退出授权的这种方法被认为是保护操作方法的最佳实践。谢谢。