Asp.net mvc NETMVC授权

Asp.net mvc NETMVC授权,asp.net-mvc,membership,Asp.net Mvc,Membership,在asp.NETMVC中,保护web应用程序某些区域的最佳方法是什么。我知道我们可以在每个操作中添加[Authorization]属性,但这似乎非常乏味,因为您必须将其放在所有位置。我正在使用成员资格提供程序,并尝试在回发模型中使用的方法,根据文件夹设置此保护。我使用web.config节来保护一些文件夹。我在mvc中尝试了这个方法,它看起来很有效,但大部分教程都使用了[Authorization]的方式 哪种方法更好?将[授权]放在控制器类的顶部。这将锁定整个控制器操作。我强烈建议不要将其放在

在asp.NETMVC中,保护web应用程序某些区域的最佳方法是什么。我知道我们可以在每个操作中添加
[Authorization]
属性,但这似乎非常乏味,因为您必须将其放在所有位置。我正在使用成员资格提供程序,并尝试在回发模型中使用的方法,根据文件夹设置此保护。我使用web.config
节来保护一些文件夹。我在mvc中尝试了这个方法,它看起来很有效,但大部分教程都使用了
[Authorization]
的方式


哪种方法更好?

将[授权]放在控制器类的顶部。这将锁定整个控制器操作。

我强烈建议不要将其放在web.config中。事实上,科纳利、汉塞尔曼、哈克和古思里也是如此——尽管不是很高(专业ASP.NETMVC1.0第23页)

路线可能会发生变化,特别是在MVC中。使用WebForm模型,路由在文件系统上进行物理表示,因此您不必真正担心它。在MVC中,由于缺少更好的术语,路由是“动态的”

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

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


只有我的2美分。

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

[Authorize]
public class ProtectedBaseController : Controller { 

}

public class AdminController : ProtectedBaseController { 
  ...
}

public class Admin2Controller : ProtectedBaseController { 
  ...
}

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

您可以添加筛选器GlobalFilters.add(newauthorizeAttribute());在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());
        }
    }
}

我认为这种方式比创建ProtectedController更好,因为它不能保证系统中所有控制器都是安全的。另外,这种方法不使用继承,这会使项目更重。

授权是保护应用程序安全的一种方法;将属性应用于每个控制器。 另一种方法是在登录和注册操作上使用新的AllowAnonymous属性。 基于当前领域做出安全决策是一件非常糟糕的事情,它会使您的应用程序面临漏洞

你能得到的代码

由于ASP.NET MVC 4包含新的AllowAnonymous属性,因此您无需再编写该代码。
在global.asax中全局设置authorized属性,然后白名单就足够了。
您希望退出授权的这种方法被认为是保护您的操作方法的最佳实践。谢谢。

好的,谢谢。问题是哪一个更好,将它放在所有控制器中,或者将它设置在一个文件web.config中。我选择了web.config.Yeah,很难不同意这一点。:)