ASP.NET MVC - расширение атрибута авторизации - PullRequest
0 голосов
/ 08 марта 2010

В настоящее время я использую [Authorize (Roles = ".....")] для защиты своих действий контроллера в моем приложении ASP.NET MVC 1, и это прекрасно работает. Однако в некоторых видах поиска должны быть кнопки, которые направляют эти действия, которые необходимо включить / отключить на основе записи, выбранной в списке поиска, а также привилегий безопасности пользователя, вошедшего в систему.

Поэтому я думаю, что мне нужен класс, обращающийся к таблице БД, который связывает эти целевой контроллер / действия с ролями приложения, чтобы определить состояние этих кнопок. Это, очевидно, приведет к путанице, так как priv нужно будет поддерживать в 2 местах - в таблице классов / БД и в действиях контроллера (плюс, если я хочу изменить доступ к действию, мне придется изменить кодировать и компилировать, а не просто изменить запись в таблице БД).

В идеале я хотел бы расширить функциональность [Authorize], чтобы вместо указания ролей в коде [Authorize] он запрашивал класс безопасности на основе пользователя, контроллера и действия, а затем возвращал логическое разрешение или запрет доступа. Есть ли хорошие статьи по этому поводу - я не могу представить, что это необычная вещь, которую я хочу сделать, но я, кажется, изо всех сил пытаюсь найти что-нибудь о том, как это сделать (может быть, мозг понедельника утром). Я начал делать некоторый код, просматривая статью http://schotime.net/blog/index.php/2009/02/17/custom-authorization-with-aspnet-mvc/, и кажется, что все начинается нормально, но я не могу найти «правильный» способ получить вызывающий контроллер и значения действия из httpContext - Я мог бы выдумать немного кода, чтобы извлечь их из URL-адреса запроса, но мне это не кажется правильным, и я бы предпочел сделать это правильно.

Приветствия

MH

1 Ответ

0 голосов
/ 02 мая 2010

Я нашел это на другом форуме и поэтому опубликую здесь, если кто-нибудь найдет это полезным. Обратите внимание, что то, как вы это делаете, меняется в зависимости от того, используете ли вы MVC 1 или 2

класс, который вы создаете, необходимо реализовать

public void OnAuthorization(AuthorizationContext filterContext)

и тогда вы можете использовать

string controllerName = filterContext.RouteData.Values["controller"].ToString();

и то же самое, подставляя «action» вместо «controller» (сначала убедитесь, что вы проверяете наличие нулей в этих значениях). В MVC 2 это можно изменить на filterContext.ActionDescriptor.ActionName и .ActionDescriptor.ControllerDescriptor.ControllerName, и вам не придется проверять наличие нулей

...