Я в основном сделал свою безопасность в основном на уровне контроллера для чего-то вроде этого. Я принял решение не передавать информацию слишком далеко вниз по цепочке, чтобы выяснить, есть ли у человека доступ к ней или, если я это сделал, я просто убедился, что IPrincipal.IsInRole () будет достаточно для ее удовлетворения.
Теперь я сделал что-то еще, что кажется более хакерским. Мне нужно было убедиться, что люди, которые были зарегистрированы и которым был назначен этот кусок, были единственными, кто мог получить к нему доступ из этого раздела.
Итак, я создал фильтр атрибутов, который работает примерно так:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var thingToView = filterContext.ActionParameters[_thingToView] as thingToView ;
var registration = filterContext.ActionParameters[_registration] as Registration;
if (!registration.CanSeeThing(thingToView))
{
throw new RegistrationCannotViewThing(registration, thingToView);
}
base.OnActionExecuting(filterContext);
}
Теперь в этой реализации ощущается что-то вроде хаки , так как я сделал это с помощью моего метода контроллера:
[AuthFilter(ThingToView ="thingToView", Registration="registration")
public ActionResult Method(Thing thingToView, Registration registration)
{
....
}
Фактические назначения параметров произошли в подшивке модели. Безопасность происходит через фильтр, который проверяет параметры, переданные методу. Затем я повторно использовал этот фильтр во многих местах.
Я сделал нечто похожее с привязкой модели к сообщению Скотта Хансельмана: http://www.hanselman.com/blog/IPrincipalUserModelBinderInASPNETMVCForEasierTesting.aspx, чтобы передать то, что пользователь вызывает методом.
Полагаю, вы можете использовать приведенный выше пример блога, чтобы передать свой пользовательский объект в метод контроллера и передать его на уровень обслуживания.