列出控制器方法及其授权属性或缺乏属性

时间:2016-01-20 16:13:10

标签: c# .net asp.net-mvc asp.net-mvc-5 authorize-attribute

我想构建一个安全检查模块,当我发现安全问题并且网站处于调试模式时,我们会将这些模块添加到我们的项目中以注入覆盖。

我想尝试的第一个例子是列出没有授权属性(或授权属性的扩展)集的控制器和方法。

是否有一种简单的方法可以获取控制器/方法的列表及其授权属性(有些是自定义属性),或者缺少它们?

主要目标是确保每个Method都有一个集合,即使它是Allow Anonymous,从而迫使开发人员识别他们有暴露/不受保护的方法。

如果还有其他更好的方法来实现这一点,我也希望听到它们,但我喜欢有一个页面指示器的想法。 EX:" 3方法缺少授权属性并暴露给用户"。

1 个答案:

答案 0 :(得分:1)

很难为您提供适合您帐单的完整答案,但您可以轻松编写一个安全控制器来检查其余页面/方法(或在应用程序启动时运行)。以下是一些示例代码,可帮助您入门:

var asm = Assembly.GetExecutingAssembly();

var x=asm.GetTypes()
  .Where(type => typeof(Controller).IsAssignableFrom(type)) //filter controllers
  .Where(controller=>controller.CustomAttributes.Any(ca=>ca.AttributeType.Name=="TranslateFilter"))
  .Where(controller=>controller.Name!="Translation")
  .SelectMany(type => type.GetMethods())
  .Where(method => method.IsPublic && !method.IsDefined(typeof(NonActionAttribute)))
  .Where(method=>method.ReturnType.Name=="ActionResult")
  .Where(method=>method.CustomAttributes.All(ca => ca.AttributeType.Name != "HttpPostAttribute"))
  .Select(t=>new {Action=t.Name,Controller=t.ReflectedType.Name.Replace("Controller", "")});

这是我写的自定义翻译引擎。这里的许多条件都不适用,但我已将它们留给您,以便了解您可以做什么以及如何做到这一点。它专门寻找具有TranslateFilter属性的控制器,并且不是名为Translation的控制器,是一个公共方法,返回类型ActionResult并且没有属性{ {1}}。

相关问题