Я прочитал столько ответов, сколько мог для этого, но они, кажется, не соответствуют одной детали.
Проблема в том, что, связывая фильтр действий (с сервисом, внедренным контроллером) с соответствующим атрибутом, я не смог выяснить, как передать значения параметра / свойства из атрибута в его связанный фильтр. Ниже приведен код, а под ним мой предполагаемый поддельный код:
Фильтр и атрибут
public class AuthorizationFilter : IAuthorizationFilter
{
private readonly IAuthorizationService _authorizationService;
private readonly UserRoles _requiredRoles; // Enum
public AuthorizationFilter(IAuthorizationService authorizationService, UserRoles requiredRoles)
{
_authorizationService = authorizationService;
_requiredRoles = requiredRoles;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Session == null)
HandleUnauthorizedRequest(filterContext);
else {
var authorized = _authorizationService.IsUserInRole((UserSessionInfoViewModel) filterContext.HttpContext.Session["user"], _requiredRoles);
if (!authorized)
HandleUnauthorizedRequest(filterContext);
// else TODO: deal with cache...
}
}
}
public class RequireRolesAttribute : FilterAttribute
{
public readonly UserRoles RequiredRoles;
public RequireRolesAttribute(UserRoles requiredRoles)
{
RequiredRoles = requiredRoles;
}
}
Привязки фильтров / атрибутов
kernel.BindFilter<AuthorizationFilter>(FilterScope.Controller, 0)
.WhenControllerHas<RequireRolesAttribute>();
kernel.BindFilter<AuthorizationFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<RequireRolesAttribute>();
Это должно убедиться, что любой контроллер / действие, украшенное [RolesRequired], привязано к фильтру. Все идет нормально. Теперь я хочу объявить через атрибут роли (так же, как стандартный AuthorizeAttribute) и передать эти значения в фильтр, который фактически выполняет авторизацию.
Намеренный / поддельный код:
[RequireRoles(UserRoles.Author)]
public ActionResult Index()
{
// blah
}
В частности,
Что требуется для информирования AuthorizationFilter о ролях? Может ли фильтр / объект доступ к аргументам, переданным конструктору атрибута? Может ли фильтр / объект извлекать их из открытого свойства атрибутов?
Для справки, эти статьи очень помогли, но не отвечайте на этот вопрос:
Внедрение зависимостей с атрибутом Ninject и Filter для asp.net mvc
Пользовательская авторизация MVC 3 и Ninject IoC
B Z, Remo Gloor, другие ... как я могу это сделать?