繁体   English   中英

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

[英]Management/Documentation of Role-Based Authorization in MVC3

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

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

我想为每个角色都具有授权定义,例如:

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

我想知道是否有任何特殊的MVC / Visual Studio / ReSharper函数可以生成具有特定角色的方法列表,或者是否以某种方式进行编译可以在我可以浏览的地方生成文档。 我到处寻找可以帮助自己的运气。

简短答案

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

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

概观

做您想要的事情的最简单(即使不是最优雅的)方法是使用常规的Visual Studio的“在文件中查找”对话框(“ 编辑”>“查找和替换”>“在文件中查找”Ctrl + Shift + F )简单地搜索项目或解决方案表达...

VS使用正则表达式查找文件

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

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中执行此操作的, 与以前的版本不同 ,VS 2013 在文件中使用标准.NET正则表达式查找文件 。)

适用于您的案例

对于以[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 = " etcetera); 但是它们至少应该提供一个良好的开端; 我使用各种Roles参数对照AuthorizeAttribute检查了它们。

如果您在理解或调整上面的正则表达式时遇到困难,则MSDN的“ 正则表达式语言-快速参考”和其他联机资源应该会有所帮助。

其他可能性

可以想到的其他几种方法(包括许多其他方法)是:

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

编辑

根据我对您的问题的看法,这简直是惊人的,我意识到我并没有停止做一个基本的探索来挑战我的经历。 :/

事实证明,Jigar.Net的一篇题为《 使用XML配置在ASP.Net MVC中进行授权》描述了一种很酷的,不同的方式来管理/文档授权- 主动使用专用的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配置节的替代方案。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM