Проверьте данные пользователя в ASP.NET MVC ActionFilter - PullRequest
0 голосов
/ 06 августа 2009

Предположим, я не хочу использовать членство и хочу ограничить доступ пользователя с помощью ActionFilter.

Я знаю, что могу создать фильтр / атрибут и переопределить метод OnActionExecuting, и в дальнейшем я могу поместить этот атрибут в ActionResult.

И давайте предположим, что у меня есть таблица с именем «tbUsers», она также имеет поле int с именем «сертификат», и в зависимости от значения «сертификата» пользователь может получить доступ к ActionResult или нет.

Но как я могу в методе OnActionExecuting проверить значение сертификата этого пользователя и предоставить ему доступ или перенаправление на страницу NotAllowed.aspx?

Спасибо !!!

Ответы [ 2 ]

4 голосов
/ 08 августа 2009

Я бы так не поступил. Я бы реализовал IAuthorizationFilter. Фильтры авторизации запускаются перед всеми фильтрами действий.

Например, предположим, что вы позже добавили атрибут OutputCache в метод действия, и он запускается до фильтра аутентификации. Это было бы плохо! Если содержимое кэшируется, фильтр аутентификации никогда не будет работать, и люди увидят кэшированные конфиденциальные данные.

1 голос
/ 06 августа 2009

ActionExecutingContext имеет HttpContext, который будет включать текущий объект User. Вы можете использовать это, чтобы получить пользователя. Вы также можете использовать его для доступа к сеансу, если хотите сохранить информацию в сеансе. Вы также можете поместить его в зашифрованный файл cookie и получить к нему доступ через контекстную форму Request.Cookies. Возможно, вы захотите подумать о последствиях этого для безопасности, хотя я не считаю это более проблематичным, чем файл cookie для аутентификации.

Проверка его по базе данных и поддержание тестируемости на вашем фильтре немного сложнее. Что я сделал, так это предоставил два конструктора для каждого класса фильтра. Один обеспечивает фабрику базы данных, которая создаст мой контекст данных. Я использую это в тестировании и поставляю фабрику фиктивных баз данных, которая создает фиктивные или фальшивые базы данных. Обычный конструктор без параметров вызывает предыдущий конструктор с нулевой фабрикой. Когда это происходит, другой конструктор создает новый экземпляр фабрики по умолчанию.

private IDatabaseFactory Factory { get; set; }
public MyFilter( IDatabaseFactory factory )
{
     this.Factory = factory ?? new DefaultDatabaseFactory();
}

public MyFilter() : this(null) { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...