처음 개발되었을 때 System.Web.Mvc.AuthorizeAttribute는 올바른 작업을 수행했습니다. HTTP 사양의 이전 버전은 "권한 없음"및 "인증되지 않은"상태 코드 401을 사용했습니다.
원래 사양에서 :
요청에 이미 인증 자격 증명이 포함 된 경우 401 응답은 해당 자격 증명에 대한 인증이 거부되었음을 나타냅니다.
사실, 혼란을 볼 수 있습니다. "인증"을 의미 할 때 "권한 부여"라는 단어가 사용됩니다. 그러나 일상적인 연습에서는 사용자가 인증되었지만 권한이없는 경우 403 Forbidden을 반환하는 것이 더 합리적입니다. 사용자에게 액세스 권한을 부여하는 두 번째 자격 증명 세트가 없을 것 같습니다.
대부분의 운영 체제를 고려하십시오-액세스 권한이없는 파일을 읽으려고하면 로그인 화면이 표시되지 않습니다!
고맙게도, 모호성을 제거하기 위해 HTTP 사양이 업데이트되었습니다 (2014 년 6 월).
"Hyper Text Transport Protocol (HTTP / 1.1) : 인증"(RFC 7235)에서 :
401 (인증되지 않음) 상태 코드는 요청이 대상 리소스에 대한 유효한 인증 자격 증명이 없기 때문에 적용되지 않았 음을 나타냅니다.
"하이퍼 텍스트 전송 프로토콜 (HTTP / 1.1) : 의미 및 컨텐츠"(RFC 7231)에서 :
403 (금지됨) 상태 코드는 서버가 요청을 이해했지만 승인을 거부 함을 나타냅니다.
흥미롭게도 ASP.NET MVC 1이 출시 될 당시 AuthorizeAttribute의 동작은 정확했습니다. 이제 동작이 잘못되었습니다. HTTP / 1.1 사양이 수정되었습니다.
ASP.NET의 로그인 페이지 리디렉션을 변경하지 않고 소스에서 문제를 해결하는 것이 더 쉽습니다. 웹 사이트의 기본 네임 스페이스에 동일한 이름 ( AuthorizeAttribute
) 으로 새 속성을 만들 수 있습니다 (매우 중요합니다). 그러면 컴파일러는 MVC의 표준 네임 스페이스 대신 자동으로이를 선택합니다. 물론 그 접근 방식을 취하고 싶다면 항상 속성에 새로운 이름을 지정할 수 있습니다.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}