Управление / Документация ролевой авторизации в MVC3

1

Я новичок в проекте и унаследовал сайт, на котором используется авторизация на основе ролей. В методах кода много атрибутов Authorize например:

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

Я хочу, чтобы у вас были определения авторизации для каждой из этих ролей, например:

  • Менеджер - может редактировать/удалять заказ
  • Admin - может редактировать/удалять пользователей

Мне было интересно, есть ли какая-либо специальная функция MVC/Visual Studio/ReSharper, которая может создавать список методов, которые имеют определенные роли, или если компиляция каким-то образом создает документацию где-нибудь, на что я могу взглянуть. Я огляделся вокруг, чтобы помочь, не повезло.

  • 0
    Это феноменальный вопрос. Независимо от того, есть ли AuthorizeAttribute или пользовательские атрибуты авторизации, я вижу, что эта необходимость возникает в нескольких проектах ASP.NET MVC - и я поражен, что я не помню никого (включая меня), когда бы он ни спрашивал, есть ли инструмент или простой механизм, чтобы помочь документировать / управлять авторизацией существует.
Теги:
visual-studio
asp.net-mvc
authorization
resharper

1 ответ

0
Лучший ответ

Короткий ответ

Я не знаю о Visual Studio или MVC-функции или плагине (включая ReSharper), чтобы делать то, что вы хотите напрямую; но Visual Studio и.NET предоставляют основные строительные блоки для этого - например, регулярные выражения и отражение.

VS Найти в файлах (с использованием регулярных выражений)

обзор

Самый простой (если не самый элегантный) способ сделать то, что вы хотите, - просто выполнить поиск проекта или решения с помощью диалогового окна Visual Studio Find in Files (Edit> Find and Replace> Find in Files или Ctrl + Shift + [ TG22]), используя регулярное выражение...

Изображение 174551

..., который будет возвращать результаты следующим образом:

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 и другие онлайн-ресурсы должны оказаться полезными.

Другие возможности

Пара других способов приблизиться к тому, что вы хотите, которые приходят на ум (среди многих других):

  • Написание быстрого инструмента, использующего отражение.NET.
  • Использование NDepend CQL.

редактировать

В моем комментарии к вашему вопросу, что это просто феноменально, я понял, что не остановился, чтобы сделать основной поиск, чтобы бросить вызов моему опыту. :/

Оказывается, статья 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).

Я планирую рассмотреть этот вопрос дальше и искать другие подходы и инструменты; надеюсь, кто-то может ответить с еще большим пониманием; но это то, что я быстро нашел, как только попытался. :}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню