Trong ASP.NET MVC, bạn có thể đánh dấu một phương pháp điều khiển với AuthorizeAttribute
, như thế này:Tại sao AuthorizeAttribute chuyển hướng đến trang đăng nhập để xác thực và ủy quyền thất bại?
[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
// ...
}
Điều này có nghĩa rằng, nếu hiện đăng nhập người dùng không nằm trong "CanDeleteTags" vai trò, bộ điều khiển phương pháp sẽ không bao giờ được gọi.
Thật không may, đối với lỗi, AuthorizeAttribute
trả về HttpUnauthorizedResult
, mã này luôn trả về mã trạng thái HTTP 401. Điều này dẫn đến chuyển hướng đến trang đăng nhập.
Nếu người dùng không đăng nhập, điều này có ý nghĩa hoàn hảo. Tuy nhiên, nếu người dùng là đã được đăng nhập nhưng không nằm trong vai trò bắt buộc, thật khó hiểu khi gửi họ trở lại trang đăng nhập.
Dường như AuthorizeAttribute
conflates xác thực và ủy quyền.
Điều này có vẻ giống như một chút giám sát trong ASP.NET MVC, hoặc tôi thiếu cái gì?
Tôi đã phải nấu một số DemandRoleAttribute
để tách hai. Khi người dùng không được xác thực, nó trả về HTTP 401, gửi chúng đến trang đăng nhập. Khi người dùng đăng nhập, nhưng không phải là vai trò được yêu cầu, nó sẽ tạo ra một NotAuthorizedResult
thay thế. Hiện tại, chuyển hướng này đến trang lỗi.
Chắc chắn tôi không phải làm điều này?
câu hỏi tuyệt vời và tôi đồng ý, nó nên ném trạng thái HTTP Not Authorized. –
Tôi thích giải pháp của bạn, Roger. Ngay cả khi bạn không. –
Trang Đăng nhập của tôi có séc chỉ chuyển hướng người dùng đến ReturnUrl, nếu anh/chị ấy đã được xác thực. Vì vậy, tôi quản lý để tạo ra một vòng lặp vô hạn của 302 chuyển hướng: D woot. –