Я новичок в проекте и унаследовал сайт, на котором используется авторизация на основе ролей. В методах кода много атрибутов 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 предоставляют основные строительные блоки для этого - например, регулярные выражения и отражение.
обзор
Самый простой (если не самый элегантный) способ сделать то, что вы хотите, - просто выполнить поиск проекта или решения с помощью диалогового окна Visual Studio Find in Files (Edit> Find and Replace> Find in Files или Ctrl + Shift + [ TG22]), используя регулярное выражение...
..., который будет возвращать результаты следующим образом:
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, который использует стандартные регулярные выражения.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); но они должны обеспечить хорошее начало по крайней мере; Я проверил их против AuthorizeAttribute
с различными аргументами Roles
.
Если у вас возникли проблемы с пониманием или настройкой вышеуказанных регулярных выражений, MSEx Regular Expression Language - Quick Reference и другие онлайн-ресурсы должны оказаться полезными.
Пара других способов приблизиться к тому, что вы хотите, которые приходят на ум (среди многих других):
В моем комментарии к вашему вопросу, что это просто феноменально, я понял, что не остановился, чтобы сделать основной поиск, чтобы бросить вызов моему опыту. :/
Оказывается, статья Jigar.Net, озаглавленная " Авторизация в ASP.Net MVC с использованием XML-конфигурации", описывает классный, отличный способ управления полномочиями/документацию - проактивно используя выделенный раздел конфигурации 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).
Я планирую рассмотреть этот вопрос дальше и искать другие подходы и инструменты; надеюсь, кто-то может ответить с еще большим пониманием; но это то, что я быстро нашел, как только попытался. :}
AuthorizeAttribute
или пользовательские атрибуты авторизации, я вижу, что эта необходимость возникает в нескольких проектах ASP.NET MVC - и я поражен, что я не помню никого (включая меня), когда бы он ни спрашивал, есть ли инструмент или простой механизм, чтобы помочь документировать / управлять авторизацией существует.