1

我正在使用 ac# MVC 网站,该网站是由不同的人在几个月的时间里开发的。该站点相当大,并且使用 .NET 成员资格设施来控制用户对各种功能的访问。

我现在的任务是进行安全审计,列出哪些用户或角色可以访问哪些功能。我可以手动执行此操作,但考虑到大量控制器及其操作,如果我可以使用代码执行此操作会更容易。我什至不知道如何开始。

因此,简而言之,我如何获取站点上所有控制器的列表、他们的操作,并确定哪些用户/角色(如果有)可以访问它们?

4

1 回答 1

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()查看该方法的属性 - 您主要在寻找AuthorizeAttribute,AllowAnonymousAttribute和您的自定义身份验证内容。也有这些ReflectedControllerDescriptor方法,用于应用于整个控制器而不是每个方法的属性。

一旦您知道设置了哪些与身份验证相关的属性,您就可以检查这些方法的属性以查看它们的设置。例如,AuthorizeAttribute公开一个Roles属性,因此对于标记的方法,[Authorise("admin", "superuser")]您将获得一个包含这些术语的字符串,因此您可以通过一些逻辑将其拆分为各个角色名称,并将其用于分组/排序/其他。对于任何自定义属性...嗯,这取决于您如何实现它们,但如果它们没有公开您需要的内容,您可以随时编辑它们以便它们这样做。

如果您的方法使用类似User.IsInRole内部的东西......好吧,我不确定是否有办法以编程方式找到它。您可能无法使用 Call Hierarchy 视图或 Find All References 来查看访问此类方法的位置,因此您可以手动筛选。

同时,作为此审核的一部分,如果您还没有记录实际访问的内容,可能值得记录。ActionFilterAttribute在我的项目中ActionDescriptor,我倾向于实现一个动作过滤器继承HttpContext.User自.

于 2013-08-05T10:22:10.413 回答