ASP.NET MVC에서 [Authorize]의 기본 동작을 무시할 수 있습니까?
-
19-09-2019 - |
문제
ASP.NET MVC에서 기본 [Authorize] 동작을 무시할 수있는 방법/방법이 궁금했습니다. 나는 새로운 액션 필터를 만들고 내 자신의 속성을 만들 수 있다는 것을 알고 있습니다. 단순히 [승인] 행동을 변경하고 그 작업을 내 코드로 바꿀 수 있다면 단지 관심이 있습니까?
편집하다: 남자와 여자. 나는 당신의 의견에 감사하지만 내가 쓴 것처럼 ~ 아니다 새로운 [xyzauthorize] 속성을 소개하려고합니다. 나는 이것을하는 방법을 알고 있습니다. [승인] 표기법을 유지하고 있지만 작동 방식을 변경하고 싶습니다.
해결책
예, AwricizeatTribute의 MSDN 문서를 살펴보십시오. http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx.
기본적으로 onauthorization () 메소드를 무시하고 동작을 사용자 정의 할 수 있습니다. 속성에는 다른 가상 메소드도 있습니다.
편집 : Bruno가 지적했듯이 AutherizeCore () 메소드를 무시할 수 있습니다. 주요 차이점은 authorizecore ()가 httpcontextbase를 사용하고 onauthorization ()는 AuthorizationContext를 취한다는 것입니다. AuthorizationContext의 인스턴스는 컨트롤러, RequestContext 및 Routedata와 같은 자세한 정보를 제공합니다. 또한 ActionResult를 지정할 수 있습니다.
AuthorizeCore ()는 액세스 할 수있는 정보와 반환 할 수있는 결과에 더 제한되어 있지만 캐시 된 데이터를 승인 해야하는 경우 논리가 추가 데이터가없는 경우를 처리해야합니다 ( 요청이 MVC 파이프 라인을 통해 라우팅되기 전에 캐시에서 데이터가 제공되므로).
언제나 그렇듯이 시나리오와 사용 가능한 도구와 그 사이의 트레이드 오프를 이해해야합니다.
다른 팁
AutherizeAttribute 필터를 서브 클래스하고 자신의 논리를 그 안에 넣을 수 있습니다.
예를 보자. 항상 로컬 연결을 승인하고 싶다고 가정 해 봅시다. 그러나 원격 연결 인 경우 일반적인 승인 논리를 유지하고 싶습니다.
당신은 다음과 같은 일을 할 수 있습니다.
public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
}
}
또는 항상 특정 원격 주소 (예 : 기계)를 승인 할 수 있습니다.
그게 다야!
편집 : 언급을 잊어 버렸습니다. AutherizeAttribute 필터를 사용하는 것과 동일하게 사용합니다.
class MyController : Controller
{
[LocalPermittedAuthorize]
public ActionResult Fire()
{
Missile.Fire(Datetime.Now);
}
}
자신의 역할 제공 업체를 구현하고 앱을 사용하도록 설정하십시오. 그런 다음 인증 속성은 Athorization 코드를 존중합니다.
나는 두 가지 방법 만 본다 : 재정의 AuthorizeAttribute.OnAuthorization
메소드 또는 자신만의 승인 속성 생성.
1) 매우 쉬운 :
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
/// your behavior here
}
}
2) 쉬운 - ASP.NET MVC 소스를보십시오. Authorizeattribute.cs 파일
평소와 같이 사용자 정의 필터를 구현할 수 있으며 (원하는 경우 승인 조정을 상속받은 다음 상속하는 새로운 ActionInvoker를 만들 수 있습니다. ControlLerActionInVoker GetFilters를 무시합니다. GetFilters에서는 전화합니다 base.GetFilters()
필터 목록을 얻으려면 인증 필터를 통해 반복하고 권한 부호로의 통화를 사용자 정의 필터에 대한 호출로 바꾸십시오.
또 다른 잠재적 인 방법은 원하는대로 사용자 정의 멤버십 및 역할 공급자를 구현하는 것입니다.