我是一个项目的新手,并继承了一个使用基于角色的授权的网站。代码中的方法有很多Authorize
属性 - 例如:
public class MyController:Controller
{
[Authorize(Roles = "Manager")]
[Authorize(Roles = "Admin")]
public ActionResult Action1()
{
//...
}
}
我想对每个角色进行授权定义,例如:
我想知道是否有任何特殊的MVC / Visual Studio / ReSharper函数可以生成具有特定角色的方法列表,或者如果编译以某种方式生成文档,我可以浏览一下。我一直在寻找一些没有运气的东西。
答案 0 :(得分:0)
我不知道Visual Studio或MVC功能或插件(包括ReSharper)可以直接执行您想要的操作;但Visual Studio和.NET提供了基本的构建块 - 例如正则表达式和反思。
<强>概述强>
最简单(如果不是最优雅)的方式,只需使用Visual Studio的在文件中查找对话框(编辑&gt)搜索项目或解决方案;使用正则表达式查找和替换&gt;在文件中查找或 Ctrl + Shift + F )...
...,将返回如下结果:
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和其他在线资源应该会有所帮助。
除了许多其他方式之外,还有其他一些方法可以解决您的想法:
根据我对你的问题的评论,这只是惊人的,我意识到我没有停下来做一个基本的搜索来挑战我的经验。 :/
事实证明,一篇名为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;工具;希望有人能以更大的洞察力回答;但这是我尝试过后很快发现的。 :}