Вопрос

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

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

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

Ваше здоровье

MH

Это было полезно?

Решение

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

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

public void OnAuthorization(AuthorizationContext filterContext)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top