我正在使用一个由不同的人在几个月的时间内开发的c#MVC网站。该网站非常庞大,使用.NET会员设施来管理用户对各种功能的访问。
我现在的任务是进行安全审核,列出哪些用户或角色可以访问哪些功能。我可以手动执行此操作,但鉴于大量控制器及其操作,如果我可以使用代码执行此操作会更容易。我对如何开始感到茫然。
因此,简而言之,我如何获取网站上所有控制器的列表,他们的操作,并确定哪些用户/角色可以访问它们?
答案 0 :(得分:1)
您可以使用一点反射来获取控制器方法。你可以得到你的控制器:
var controllers = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(Controller));
其中Controller
是标准基类;如果你有自己的自定义基本控制器,你可以使用它。这假设您在应用程序中运行此代码;如果不是这种情况,则用适当的逻辑替换Assembly.GetExecutingAssembly()
以找到应用程序的程序集。 Assembly.GetExecutingAssembly()
更容易,所以我只想添加一个功能,只在管理员区域内执行此操作,如果有这样的话。
上面的那一行将为您的控制器提供一组System.Type
个对象。从那里,foreach (var TController in controllers)
通过它们并获得他们的方法:
var actions = new ReflectedControllerDescriptor(typeof(TController)).GetCanonicalActions();
这会为您提供一系列ActionDescriptor
个对象,您可以使用GetFilterAttributes()
和GetCustomAttributes()
来查看该方法的属性 - 您主要是在寻找{{1} },AuthorizeAttribute
和您的自定义身份验证资料。对于应用于整个控制器而不是按方法的属性,AllowAnonymousAttribute
也有这些方法。
一旦知道设置了哪些与auth相关的属性,就可以检查这些方法的属性以查看它们的设置。例如,ReflectedControllerDescriptor
公开AuthorizeAttribute
属性,因此对于标记为Roles
的方法,您将获得包含这些术语的字符串,因此只需稍加逻辑就可以将其拆分为单个角色名称并使用它们进行分组/排序/其他。对于任何自定义属性......好吧,这取决于你如何实现它们,但是如果它们没有暴露你需要的东西,你可以随时编辑它们。
如果你的方法在内部使用类似[Authorise("admin", "superuser")]
的东西......好吧,我不确定是否有办法以编程方式找到它。您可能会使用“调用层次结构”视图或“查找所有引用”来查看访问该类方法的位置,因此您可以手动筛选。
同时,作为此次审核的一部分,如果您还没有,那么可能值得记录实际访问的内容。在我的项目中,我倾向于实现一个继承自User.IsInRole
的动作过滤器,使用一些检查上述属性的逻辑,并使用作为一部分传入的ActionFilterAttribute
和ActionDescriptor
过滤器上下文记录正在访问的操作以及访问者。