2010-09-16 4 views
0

Я использую поставщик членства asp.net для аутентификации пользователя. У меня есть другая таблица с дополнительной информацией пользователя, связанной с моей таблицей aspnet_users.Как расширить ASP.NET MVC AuthorizeAttribute

Когда пользователь регистрируется на моем сайте, я помещаю то, что я называю своим «UserProfile» в переменную сеанса, и мне нужно проверить наличие этой переменной сеанса при каждом вызове в моих контроллерах (все контроллеры за моей страницей входа) ,

Так что мой вопрос заключается в следующем:

Я написал ActionFilter, который наследует AuthorizeAttribute, который вызывает метод по умолчанию base.AuthorizeCore() и проверяет наличие моего объекта Session (сессия [ "UserProfile "]), Я также создал базовый контроллер, который хранит мой объект типа UserProfile, который наследует все соответствующие классы контроллеров, поэтому у них есть доступ к моему UserProfile. Как использовать мой метод в моем ActionFilter для установки этого свойства UserProfile переменной Session в моем контроллере?

ответ

0

Почему вы не можете просто сделать это в базовом контроллере? Это кажется правильным местом для заполнения собственности. Выполнение вашего настраиваемого атрибута authorize создаст зависимость, которая не должна существовать и приведет к большей сложности. Я говорю, что проверка наличия ключа в сеансе, в то время как связанная, не совпадает с заполнением свойства. На самом деле это может быть очень сильно отличаться, если вы в конечном итоге решили, например, хранить только ключ DB в сеансе и каждый раз извлекать более сложный объект профиля из базы данных. Обратите также внимание на то, что атрибут authorize впоследствии может быть применен просто к методу вместо класса - в этот момент вы можете выполнять совокупность свойства несколько раз.

Если вам кажется, что вы должны, однако, передать AuthorizationContext, переданный методу OnAuthorization этого атрибута, содержит ссылку на контроллер. Вы можете использовать это как ваш базовый контроллер (используя синтаксис as и проверку на недействительность), затем получить доступ к свойству напрямую (если оно открыто) или через отражение (если нет).

0

То же, что и tvanfosson, не добавляйте свойство к базе вашего контроллера, которое зависит от применяемого ActionFilter.

Альтернатива перемещает код в отдельный класс, который получает/проверяет доступ к указанному свойству. И ActionFilter, и база контроллера используют указанный класс для извлечения значения. Зависимость делается явно, что облегчает ее понимание для другого разработчика.