확인. 전역 적으로 그리고 장소에서 [Authorize] 속성을 재정의 할 방법이 없으므로 여기에 어떻게 완료했는지 설명합니다.
응용 프로그램의 전역 네임 스페이스에 새로운 사용자 정의 AuthorizeAttribute
클래스를 만듭니다 (내 CustomAuthorizeAttribute
이라고 함). 이 클래스 파일을 Extend
(MVC 프레임 워크를 확장 할 때 모든 사용자 정의 클래스를 넣는 곳) 폴더에 배치하고 내 응용 프로그램의 루트 네임 스페이스와 동일한 네임 스페이스인지 확인했습니다 (모든 컨트롤러에서 '볼 수있는'방법).).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace CustomProject
{
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
System.Web.Routing.RouteValueDictionary rd;
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
rd = new System.Web.Routing.RouteValueDictionary(new { action = "NotAuthorized", controller = "Error" });
}
else
{
//user is not authenticated
rd = new System.Web.Routing.RouteValueDictionary(new { action = "Login", controller = "Account" });
}
filterContext.Result = new RedirectToRouteResult(rd);
}
}
}
내 CustomAuthorizeAttribute
계정 인증 된 사용자 시나리오에 소요/적절하게 리디렉션 다시 라우팅합니다.
그러면 응용 프로그램에 구성한 역할을 사용하여 [CustomAuthorize(Roles="Admin")]
을 컨트롤러 및/또는 감시하려는 작업에 추가해야합니다.
또한 오류를 처리하고 내 요구에 "NotAuthorized"작업을 추가하기 위해 ErrorController
을 만들었습니다. 원하는 경우 확실히 확장 할 수 있습니다. 일부 로깅을 포함 할 수 있습니까?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace HypeKick.BankUI.Controllers
{
public class ErrorController : Controller
{
//
// GET: /Error/
public ActionResult Index()
{
return View();
}
public ActionResult NotAuthorized()
{
return View();
}
}
}
필요한보기를 만드는 것을 잊지 마세요!
아니요. 컨트롤러 나 액션을'Authorize'로 꾸미면이를'AuthorizeAttribute' 객체에 연결합니다. 당신은 자신의 MVC 어셈블리를 만들고 싶지 않다면 분명히 그 객체의 소스를 편집 할 수 없습니다. 가장 좋은 방법은 그것으로부터 파생되어 다른 게시물에 설명 된대로 적절한 메소드를 오버라이드하는 것입니다. –
감사합니다. @ChrisHardie! 위의 게시물을 사용자 지정 속성을 사용하여 만든 방법으로 업데이트했습니다. – FrankO
FWIW, 이것은'AuthorizeAttribute'가 아닙니다. 특정 액션에 대한 액세스 권한이없는 인증 된 사용자에 대해 적절한 403 응답을 반환합니다. 양식 인증은 실제로 여기에 범인입니다. 401 (인증되지 않음)과 403 (인증되었지만 인증되지 않음)을 모두 차단하고 로그인 페이지로 리디렉션합니다. 그것도 멈추는 방법이없는 것 같습니다. 401 또는 403을 반환하기 전에 작업 내의 리디렉션 (ASP.NET 4.5 이상)을 수동으로 비활성화 할 수 있지만 두 가지 상태 코드 중 하나만 사용할 수는 없습니다. –