2012-02-28 30 views
14

Tôi đang cố triển khai thuộc tính ủy quyền tùy chỉnh trên các bộ điều khiển API Web của tôi, nhưng đã gặp một hành vi không mong muốn.Tùy chỉnh MVC AuthorizeAttribute cho ASP.NET Web API

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

Đoạn mã trên hoạt động rất tốt: Nó sẽ cho phép "myuser" để lấy các mặt hàng, bot không ai được phép truy cập. Tuy nhiên, khi tôi thử cách tiếp cận tương tự với ủy quyền tùy chỉnh của mình, toàn bộ kiểm tra bị bỏ qua và mọi người dùng đều có thể truy cập tài nguyên. Không phải các phương thức ghi đè AuthorizeCore hoặc OnAuthorization trong lớp dẫn xuất của tôi đều được gọi.

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

Các lớp được thừa kế được thừa hưởng từ System.Web.Mvc.AuthorizeAttribute, và dự án được triển khai trên IIS, với Windows Authentication & Mạo danh kích hoạt, và Anonymous Xác thực người tàn tật.

Nếu tôi thêm cùng một ủy quyền tùy chỉnh vào Bộ điều khiển MVC, thì nó hoạt động. Nhưng trên bộ điều khiển API, không có gì. Nếu thuộc tính Authorize sẽ không hoạt động được, nó sẽ có ý nghĩa hơn. Tui bỏ lỡ điều gì vậy? Đây có phải là hành vi được mong đợi hoặc lỗi trong bản Beta không?

Trả lời

31

Bạn nên sử dụng System.Web.Http.AuthorizeAttribute từ System.Web.Http.dll cho Web API thay vì System.Web.Mvc.AuthorizeAttribute.

Tức là, vì namespace System.Web.Http.AuthorizeAttribute có nguồn gốc từ AuthorizationFilterAttribute. Các bộ lọc được API Web xử lý tự động. Trong thực hiện của riêng tôi, tôi lấy trực tiếp từ AuthorizationFilterAttribute để xử lý xác thực HTTP cơ bản.

+0

Cảm ơn, thay đổi không gian tên đã hoạt động! Nó vẫn có vẻ lạ khi sử dụng 'System.Web.Mvc.AuthorizeAttribute' làm việc cho Web API, trong khi lớp của tôi, bắt nguồn từ lớp chính xác đó, thì không. –

+1

Có vẻ như nhiều loại trùng lặp giữa MVC và API Web. Có thể chúng sẽ được hợp nhất và chúng ta sẽ có một loại mẫu đơn trong bản phát hành. Vì vậy, có thể một trong hai đối tượng 'AuthorizeAttibute' đang được kiểm tra nội bộ, chỉ cần đoán. –

Các vấn đề liên quan