2015-12-14 46 views
2

我想创建一个静态分析代码规则,以便任何控制器的方法必须继承AllowAnonymous或Authorize,或者具有显式的AllowAnonymous或Authorize属性 - 以便每个操作都被明确地解决方式或其他。配置静态分析来检测不安全的MVC路由

任何指导如何做到这一点 - 或者如果你看到更好的解决方案 - 将不胜感激。

回答

1

推荐的方法是在全球注册AuthorizeAttribute。的动作方法这没有有效手段可以在默认情况下无需登录访问。

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     // Enable white-list security 
     filters.Add(new AuthorizeAttribute()); 
     filters.Add(new HandleErrorAttribute()); 
    } 
} 

而且在Global.asax.cs中

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 

     // Register global filters 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     AuthConfig.RegisterAuth(); 
    } 
} 

这将有效地使“白名单”的安全性,这意味着你将不得不明确退出安全方案,公众应该看到的方法(例如主页)上的AllowAnonymous属性。

public class HomeController : Controller 
{ 
    [AllowAnonymous] 
    public ActionResult Index() 
    { 
     ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; 

     return View(); 
    } 
} 

请注意,您还可以在控制器的水平,这将使得HomeController的所有方法匿名在默认情况下选择退出的白名单安全。

[AllowAnonymous] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; 

     return View(); 
    } 
} 
+0

是的,我已经实现了这一点,但我想强制开发人员明确标识每个属性是否需要登录。 –

+0

我明白了。也许更好的方法是做一个单元测试来验证这一点,并设置你的构建过程失败,如果失踪。这肯定会强制这件事。 – NightOwl888

+0

是的,这不是一个坏主意,但我想提出一个规则集,我可以将其应用于我们所有的MVC项目。单元测试将被绑定到特定的项目,并且必须为每个项目重写。不过,我认为这是我的计划B. –