2012-03-08 16 views
0

作爲啓用身份的授權系統的一部分,我想使用IAuhtorizationFilter和Attributes來限制對控制器中操作方法的訪問。我已經得到的東西的工作非常好,部分原因是由於從以下資源幫助:使用Ninject的BindFilter時,同一類型的多個屬性失敗<T>

然而,當我嘗試裝飾一個具有多個屬性的操作方法,我得到一個異常如下(對於格式化抱歉):

 
[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屬性中的一個或另一個被去除如預期。兩者都有,產生異常。我意識到,在這個簡化的例子中,沒有一種情況需要這兩個屬性,但它僅僅是爲了說明。

我錯過了什麼?

回答

1

這是Ninject 2.2的已知問題。請使用3.0代替。

https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/ReleaseNotes.txt

+0

謝謝,雷莫。我很欣賞這些信息,我對你在這裏回覆帖子的速度印象深刻。謝謝。 – 2012-03-08 18:11:58

+0

我仍然遇到與NuGet的3.0.0-rc3相同的問題。我創建了一個新的示例項目,遵循上面的相同概念,並且我得到InvalidOperationException:「序列包含多個元素」。有任何想法嗎? – 2012-03-15 14:54:32

相關問題