0
作爲啓用身份的授權系統的一部分,我想使用IAuhtorizationFilter和Attributes來限制對控制器中操作方法的訪問。我已經得到的東西的工作非常好,部分原因是由於從以下資源幫助:使用Ninject的BindFilter時,同一類型的多個屬性失敗<T>
- Ninject Binding Attribute to Filter with Constructor Arguments
- https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations
- Custom Authorization MVC 3 and Ninject IoC
- https://github.com/ninject/ninject.web.mvc/wiki/Dependency-injection-for-filters
然而,當我嘗試裝飾一個具有多個屬性的操作方法,我得到一個異常如下(對於格式化抱歉):
[InvalidOperationException: Sequence contains more than one element] System.Linq.Enumerable.Single(IEnumerable`1 source) +2691369 Ninject.Web.Mvc.FilterBindingSyntax.c__DisplayClass15`1.b__14(IContext ctx, ControllerContext controllerContext, ActionDescriptor actionDescriptor) in c:\Projects\Ninject\Maintenance2.2\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\FilterBindingSyntax\FilterFilterBindingBuilder.cs:379 Ninject.Web.Mvc.FilterBindingSyntax.c__DisplayClass12.b__11(IContext ctx) in c:\Projects\Ninject\Maintenance2.2\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\FilterBindingSyntax\FilterFilterBindingBuilder.cs:358 Ninject.Parameters.c__DisplayClass6.b__4(IContext ctx, ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Parameters\Parameter.cs:60 Ninject.Parameters.Parameter.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Parameters\Parameter.cs:88 Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:97 Ninject.Activation.Providers.c__DisplayClass2.b__1(ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81 ...
這裏是我的代碼非常簡化版本,在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
屬性中的一個或另一個被去除如預期。兩者都有,產生異常。我意識到,在這個簡化的例子中,沒有一種情況需要這兩個屬性,但它僅僅是爲了說明。
我錯過了什麼?
謝謝,雷莫。我很欣賞這些信息,我對你在這裏回覆帖子的速度印象深刻。謝謝。 – 2012-03-08 18:11:58
我仍然遇到與NuGet的3.0.0-rc3相同的問題。我創建了一個新的示例項目,遵循上面的相同概念,並且我得到InvalidOperationException:「序列包含多個元素」。有任何想法嗎? – 2012-03-15 14:54:32