控制器上的Asp.net MVC5和WebApi2擁有Authorize
屬性,可以讓您過濾角色。例如:如果用戶的角色不正確,Asp.net mv5 403或401代碼
[Authorize(Roles="HomePageUser")]
public ActionResult Home(){
return View();
}
但這發出401
狀態代碼,如果用戶進行身份驗證,但不正確的角色。我的問題很簡單:這是最好的方法,還是我應該編寫一個過濾器,如果它們通過身份驗證但發生錯誤角色,則會發送403
?
要明白爲什麼這是一個問題,請考慮:不在角色HomePageUser
中的用戶登錄並嘗試訪問Home
頁面。 Authorize
過濾器會發出一個401代碼,然後Owin上下文會攔截並轉換爲302重定向到登錄頁面。但是,用戶實際上已登錄,並且沒有任何登錄可以糾正用戶身份缺少查看頁面權限的事實。
實際上,這一切都意味着對用戶感到沮喪,因爲自動重定向從來沒有給他們提供關於他們爲什麼看不到頁面的任何信息 - 他們很可能認爲他們輸入的密碼不正確。
在我看來,關鍵故障這裏就是Authorize
過濾撒謊 - 用戶是不能擅自但禁止,它應該發出一個403
這是我心目中的代碼來解決這個。對於MVC操作:
using System.Web.Mvc;
public class AuthorizeOrForbidAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new HttpStatusCodeResult(403);
}
else
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
,併爲Web API操作:
using System.Web.Http;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Principal;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Http.Properties;
public class AuthorizeOrForbidAttribute: AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (actionContext.RequestContext.Principal.Identity.IsAuthenticated)
{
actionContext.Response = actionContext.ControllerContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, actionContext.RequestContext.Principal.Identity.Name+" does not have permissions for this request.");
}
else
{
actionContext.Response = actionContext.ControllerContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Authorization has been denied for this request.");
}
}
}
從那裏,它是很容易將這些狀態代碼重新定向到具體取決於您希望用戶看到相應的錯誤頁面。
這是一個很好的方法嗎?我很擔心,因爲我想知道微軟是否有一個很好的理由並沒有做到這一點。
這似乎是正確的方式,因爲默認情況下Authorize屬性的行爲與您描述的一樣。看到這個答案 - > http:// stackoverflow。com/questions/2578756/how-to-make-authorize-attribute-return-custom-403-error-page-instead-of-redirect –