2012-02-28 121 views
14

我试图在Web API控制器上实现自定义授权属性,但遇到了意外的行为。ASP.NET Web API的自定义MVC AuthorizeAttribute

 <Authorize(Users:="myUser")> 
    Public Function GetTodoItems() As IQueryable(Of TodoItem) 

上面的代码工作得非常好:它将使“MYUSER”检索项目,BOT没有其他人被允许访问。但是,当我使用我的自定义授权尝试相同的方法时,整个检查将被跳过,并且任何用户都可以访问资源。我的派生类中的AuthorizeCoreOnAuthorization重写的方法都没有被调用。

 <MyAuth(Users:="myUser")> 
    Public Function GetTodoItems() As IQueryable(Of TodoItem) 

的派生类System.Web.Mvc.AuthorizeAttribute继承,并且该项目在IIS上部署,与Windows身份验证 & 模拟启用匿名身份验证禁用。

如果我将相同的自定义授权添加到MVC控制器,那么它的工作原理。但在API控制器上,什么都没有。如果Authorize属性也不起作用,它会更有意义。我错过了什么吗?这是预期的行为还是Beta版中的错误?

回答

31

您应该使用System.Web.Http.dll中的System.Web.Http.AuthorizeAttribute来获取Web API,而不是System.Web.Mvc.AuthorizeAttribute

也就是说,因为namespace System.Web.Http.AuthorizeAttribute来自AuthorizationFilterAttribute。过滤器由Web API自动处理。在我自己的实现中,我直接从AuthorizationFilterAttribute派生出来用于处理基本的HTTP身份验证。

+0

谢谢,改变命名空间的工作!使用'System.Web.Mvc.AuthorizeAttribute'工作在Web API上似乎很奇怪,而我的类从那个确切的类派生出来,却没有。 – 2012-02-28 16:04:09

+1

似乎很多类型在MVC和Web API之间重复。也许他们会被合并,我们将在发布中获得单一样本类型。所以,可能任何一个'AuthorizeAttibute'对象都在内部检查,只是猜测。 – 2012-02-28 16:08:06