2012-02-28 47 views
14

Estoy tratando de implementar un atributo de autorización personalizado en los controladores de mi API web, pero me encontré con un comportamiento inesperado.Custom MVC AuthorizeAttribute para ASP.NET Web API

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

El código anterior funciona muy bien: Permitirá "myUser" para recuperar los artículos, bot nadie se le permite el acceso cosa. Sin embargo, cuando intento el mismo enfoque con mi autorización personalizada, se omite todo el cheque y cualquier usuario puede acceder al recurso. Ni los métodos reemplazados AuthorizeCore ni OnAuthorization en mi clase derivada se llaman.

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

La clase derivada hereda de System.Web.Mvc.AuthorizeAttribute, y el proyecto se implementa en IIS, la autenticación de Windows & suplantación habilitada y autenticación anónima discapacitados.

Si agrego la misma autorización personalizada a un controlador MVC, entonces funciona. Pero en los controladores API, nada. Si el atributo Authorize tampoco hubiera funcionado, hubiera tenido más sentido. ¿Me estoy perdiendo de algo? ¿Es esto un comportamiento esperado, o un error en la Beta?

Respuesta

31

Debe usar System.Web.Http.AuthorizeAttribute desde System.Web.Http.dll para Web API en lugar de System.Web.Mvc.AuthorizeAttribute.

Es decir, porque namespace System.Web.Http.AuthorizeAttribute se deriva de AuthorizationFilterAttribute. Los filtros son manejados automáticamente por la API web. En mi propia implementación, obtuve directamente de AuthorizationFilterAttribute para manejar la autenticación HTTP básica.

+0

Gracias, cambiando el espacio de nombres funcionó! Todavía parece extraño que el uso de 'System.Web.Mvc.AuthorizeAttribute' funcionara para la API web, mientras que mi clase, que derivaba de esa clase exacta, no lo hizo. –

+1

Parece que hay muchos tipos duplicados entre MVC y la API web. Tal vez se fusionarán y tendremos una única muestra de tipo en el lanzamiento. Entonces, tal vez cualquiera de los objetos 'AuthorizeAttibute' se esté revisando internamente, solo una conjetura. –

Cuestiones relacionadas