MVC3中基于角色的授权的管理/文档

时间:2014-11-05 23:51:24

标签: c# asp.net-mvc visual-studio authorization resharper

我是一个项目的新手,并继承了一个使用基于角色的授权的网站。代码中的方法有很多Authorize属性 - 例如:

public class MyController:Controller
{
    [Authorize(Roles = "Manager")]
    [Authorize(Roles = "Admin")]
    public ActionResult Action1()
    {
        //...
    }
}

我想对每个角色进行授权定义,例如:

  • 经理 - 可以编辑/删除订单
  • 管理员 - 可以修改/删除用户

我想知道是否有任何特殊的MVC / Visual Studio / ReSharper函数可以生成具有特定角色的方法列表,或者如果编译以某种方式生成文档,我可以浏览一下。我一直在寻找一些没有运气的东西。

1 个答案:

答案 0 :(得分:0)

简答

我不知道Visual Studio或MVC功能或插件(包括ReSharper)可以直接执行您想要的操作;但Visual Studio和.NET提供了基本的构建块 - 例如正则表达式和反思。

VS在文件中查找(使用正则表达式)

<强>概述

最简单(如果不是最优雅)的方式,只需使用Visual Studio的在文件中查找对话框(编辑&gt)搜索项目或解决方案;使用正则表达式查找和替换&gt;在文件中查找 Ctrl + Shift + F )...

VS Find in Files Using Regular Expressions

...,将返回如下结果:

Find all "(?<=\[[HttpGet]+\]\s+(\[[A-Za-z_]+\]\s+)*)(public\s+)(?!(class|interface)\s+)[A-Za-z_<>]+\s+[A-Za-z_]+\s*\(", Regular expressions, Subfolders, Find Results 1, Entire Solution, "*.cs"
  C:\Users\me\Source\Repo\Solution\Controllers\Controller.cs(21):        public List<SomeType> Action1() {
  C:\Users\me\Source\Repo\Solution\Controllers\Controller.cs(30):        public List<Foo> Action2() {
  C:\Users\me\Source\Repo\Solution\Controllers\Controller.cs(38):        public List<Bar> Action3() {
  C:\Users\me\Source\Repo\Solution\Controllers\AnotherController.cs(46):        public List<Bar> ActionA(int n) {
  C:\Users\me\Source\Repo\Solution\Controllers\AnotherController.cs(78):        public List<Baz> ActionB() {
  C:\Users\me\Source\Repo\Solution\Controllers\YetAnotherController.cs(35):        public SomeOtherType ActionAlpha() {
  C:\Users\me\Source\Repo\Solution\Controllers\YetAnotherController.cs(51):        public List<SomeType> ActionBeta(int n) {
  Matching lines: 7    Matching files: 3    Total files searched: 32

我在这里搜索了[HttpGet]的公共方法。 (另请注意,我在VS 2013中执行了此操作,which uses standard .NET regular expressions for Find in Files unlike previous versions。)

适用于您的案例

对于以[Authorize(Roles = "<role>"]为中心的案例,我将从具有属性的所有方法的以下正则表达式开始...

(?<=\[Authorize\(Roles = "[A-Za-z]"\)\]\s+)(public\s+)(?!(class|interface)\s+)[A-Za-z_<>]+\s+[A-Za-z_]+\s*\(

...以及具有该属性和特定Roles参数的方法的较窄变体(例如"Admin"):

(?<=\[Authorize\(Roles = "Admin"\)\]\s+)(public\s+)(?!(class|interface)\s+)[A-Za-z_<>]+\s+[A-Za-z_]+\s*\(

对上述正则表达式的调整可能会改善您的结果(例如[A-Za-z_]Roles *= *"等字符类,而不是Roles = "等等;但它们至少应该提供一个良好的开端;我使用各种AuthorizeAttribute参数对Roles进行了检查。

如果您无法理解或调整上述正则表达式,MSDN的Regular Expression Language - Quick Reference和其他在线资源应该会有所帮助。

其他可能性

除了许多其他方式之外,还有其他一些方法可以解决您的想法:

  • 编写一个使用.NET反射的快速工具。
  • 使用NDepend's CQL

修改

根据我对你的问题的评论,这只是惊人的,我意识到我没有停下来做一个基本的搜索来挑战我的经验。 :/

事实证明,一篇名为Authorization in ASP.Net MVC using XML Configuration的Jigar.Net文章描述了一种很酷的,不同的管理/文档授权方式 - 主动使用如下的专用XML配置部分......

< controllers > 
   < controller  name ="Admin"> 
     < roles > 
       < role > Admin </ role > 
       < role > Edit </ role > 
       < role > View </ role > 
     </ roles > 
     < actions > 
       < action  name ="Index"> 
         < roles > 
           < role > Admin </ role > 
           < role > Edit </ role > 
           < role > View </ role > 
         </ roles > 
       </ action > 
       < action  name ="Edit"> 
         < roles > 
           < role > Edit </ role > 
           < role > Admin </ role > 
         </ roles > 
       </ action > 
       < action  name ="Admin"> 
         < roles > 
           < role > Admin </ role > 
         </ roles > 
       </ action > 
     </ actions > 
   </ controller > 
   < controller  name ="Home"> </ controller > 
</ controllers >

...与支持代码配对。 (该文章还强调数据库当然是XML配置部分的替代方案。)

我打算进一步考虑这个问题并寻找其他方法&amp;工具;希望有人能以更大的洞察力回答;但这是我尝试过后很快发现的。 :}