我尽可能地阅读了许多答案,但它们似乎缺少一个细节。
问题在于,当将一个带有由控制器注入的服务绑定的操作过滤器绑定到相应的属性时,我无法弄清楚如何从属性中传递参数/属性值到其绑定的过滤器。以下是代码,以及我打算使用的虚拟代码:
过滤器和属性
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和ASP.NET MVC的Filter属性进行依赖注入
B Z、Remo Gloor和其他人……我该怎样实现它?
FilterAttribute
派生的类具有多个参数的构造函数(例如上面示例中具有多个参数的 RequireRoles 类),则在.WithConstructorArgumentFromActionAttribute<TAttribute>()
中如何映射这些参数? - VipreshBindFilter<>()
方法可用,您可以添加对Ninject.Web.Mvc.FilterBindingSyntax
的引用。 - Aage