Tôi muốn cả Xác thực mẫu và trả về 401 cho các yêu cầu Ajax không được xác thực.
Cuối cùng, tôi đã tạo một AuthorizeAttribute tùy chỉnh và trang trí các phương thức điều khiển. (Đây là trên Net 4.5)
//web.config
<authentication mode="Forms">
</authentication>
// điều khiển
[Authorize(Roles = "Administrator,User"), Response302to401]
[AcceptVerbs("Get")]
public async Task<JsonResult> GetDocuments()
{
string requestUri = User.Identity.Name.ToLower() + "/document";
RequestKeyHttpClient<IEnumerable<DocumentModel>, string> client =
new RequestKeyHttpClient<IEnumerable<DocumentModel>, string>(requestUri);
var documents = await client.GetManyAsync<IEnumerable<DocumentModel>>();
return Json(documents, JsonRequestBehavior.AllowGet);
}
// AuthorizeAttribute
public class Response302to401 : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult
{
Data = new { Message = "Your session has died a terrible and gruesome death" },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
filterContext.HttpContext.Response.StatusCode = 401;
filterContext.HttpContext.Response.StatusDescription = "Humans and robots must authenticate";
filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
}
}
//base.HandleUnauthorizedRequest(filterContext);
}
}
Nguồn
2013-06-18 06:01:09
Cách tốt nhất để thực hiện chuyển hướng của riêng bạn là phân lớp AuthorizeAttribute, và khi không được phép đặt kết quả thành một RedirectResult thay vì HttpUnauthorizedResult. –
Có, nhưng trong trường hợp này OP muốn gửi mã HTTP 401, nhưng không chuyển hướng (để hoạt động đúng với JSON). –
Làm việc cho tôi - mặc dù tôi đã định cấu hình cài đặt là thay vì xóa hoàn toàn thuộc tính. –