作为启用身份的授权系统的一部分,我想使用IAuhtorizationFilter和Attributes来限制对控制器中操作方法的访问。我的工作做得很好,部分原因是以下资源的帮助:
- 要使用构造函数参数筛选的Ninject绑定属性
- https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations
- 自定义授权MVC 3和Ninject IoC
- https://github.com/ninject/ninject.web.mvc/wiki/Dependency-injection-for-filters
然而,当我试图用我的多个属性装饰一个操作方法时,我会得到如下异常(很抱歉格式化):
[InvalidOperationException:序列包含多个元素]System.Linq.Enumerable.Single(IEnumerable`1源)+2691369Ninject.Web.Mvc.FilterBindingSyntax.c__DisplayClass15`1.b__14(IContext ctx,ControllerContext ControllerContext,ActionDescriptor ActionDescriptor),位于c:\Projects\Ninject\Maintenance2.2\Ninject.Web.Mvc\mvc3\src\Ninject.Web.Mvc\FilterBindingSyntax\FilterFilterBindingBuilder.cs:379在c:\Projects\Ninject\Maintenance2.2\Ninject.Web.Mvc\mvc3\src\Ninject.Web.Mvc\FilterBindingSyntax.c__DisplayClass12.b_11(IContext ctx)中c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Parameters\Parameter.cs:60中的Ninject.Parameters.c_DisplayClass6.b_4(IContext ctx,ITarget target)c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Parameters\Parameter.cs:88中的Ninject.Parameters.GetValue(IContext上下文,ITarget-target)c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Activation\Providers\StandardProvider.GetValue(IContext上下文,ITarget-target)c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81中的Ninject.Activation.Providers.c_DisplayClass2.b_1(I目标目标)。。。
以下是我的代码的一个非常简化的版本,它演示了MVC3应用程序中的问题:
属性:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class SampleAttribute : Attribute
{
private Guid typeId;
public bool IsAllowed { get; set; }
public SampleAttribute(bool IsAllowed)
{
this.IsAllowed = IsAllowed;
this.typeId = new Guid();
}
public override object TypeId
{
get
{
return (object)typeId;
}
}
}
过滤器:
public class SampleFilter : IAuthorizationFilter, IMvcFilter
{
private bool isAllowed;
public bool AllowMultiple
{
get { return true; }
}
public int Order
{
get { return 0; }
}
public SampleFilter(bool isAllowed)
{
this.isAllowed = isAllowed;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
if (!isAllowed)
throw new Exception("unauthorized");
}
}
控制器:
public class HomeController : Controller
{
[Sample(true)]
[Sample(false)]
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
}
如果Index()
方法上的一个或另一个Sample
属性被移除,则上述控制器方法按预期工作。将两者都放在适当的位置,生成异常。我意识到,在这个简化的例子中,没有一种情况需要同时使用这两个属性,但这只是为了说明。
我错过了什么?
这是Ninject 2.2的一个已知问题。请改用3.0。
https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/ReleaseNotes.txt