2015-07-03 24 views
44

Tôi có trang web MVC webapi sử dụng xác thực OAuth/token để xác thực yêu cầu. Tất cả các bộ điều khiển có liên quan đều có thuộc tính phù hợp và xác thực đang hoạt động tốt.ASP.NET Web API: Cách đúng để trả lại 401/phản hồi trái phép

Vấn đề là không phải tất cả yêu cầu đều có thể được ủy quyền trong phạm vi thuộc tính - một số kiểm tra ủy quyền phải được thực hiện bằng mã được gọi bằng phương pháp điều khiển - cách trả lại phản hồi trái phép 401 là chính xác trong trường hợp này?

Tôi đã thử throw new HttpException(401, "Unauthorized access");, nhưng khi tôi làm điều này, mã trạng thái phản hồi là 500 và tôi cũng nhận được một dấu vết ngăn xếp. Ngay cả khi chúng tôi đăng nhập DelegatingHandler, chúng tôi có thể thấy rằng phản hồi là 500, chứ không phải 401.

Trả lời

70

Bạn nên ném một HttpResponseException từ phương pháp API của bạn, không HttpException:

throw new HttpResponseException(HttpStatusCode.Unauthorized); 

Hoặc, nếu bạn muốn cung cấp một thông báo tùy chỉnh :

var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" }; 
throw new HttpResponseException(msg); 
+0

Chỉ cần có nó làm việc chính xác điều này, cảm ơn! – GoatInTheMachine

4

Bạn nhận được mã phản hồi 500 vì bạn đang ném ngoại lệ (HttpException) cho biết một số lỗi máy chủ. tiếp cận.

Chỉ cần thiết lập trạng thái mã phản hồi .eg

Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
+0

Nó một chút lẻ sau đó ngoại trừ mất mã trạng thái HTTP như một tham số và các tài liệu intellisense nói rằng đây là mã trạng thái được gửi tới máy khách - tôi đã hy vọng tránh tự tắt phản hồi trực tiếp vì điều này có vẻ dễ xảy ra lỗi, xem trạng thái toàn cục của nó là – GoatInTheMachine

+1

Bộ điều khiển API Web cơ sở không lộ ra một 'R đặc tính của esponse'. – LukeH

46

Chỉ cần trả lại các mục sau:

return Unauthorized(); 
+0

Tôi nghĩ câu trả lời được chấp nhận là câu hỏi của OP. Câu trả lời của tôi trả lời tiêu đề của câu hỏi "ASP.NET Web API: Đúng cách trả lại một phản hồi 401/trái phép" – JohnWrensby

2

Để thay thế cho câu trả lời khác, bạn cũng có thể sử dụng này:

return Content(HttpStatusCode.Unauthorized, "My error message"); 

Rõ ràng cụm từ lý do là khá tùy chọn (Can an HTTP response omit the Reason-Phrase?)

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