2012-05-10 2 views
1

내가 .NET MVC, 기본적으로 요구 사항을 가진 컨트롤러/액션을 시도 무단 액세스를 기록하는 가장 좋은 방법을 확립하기 위해 노력하고있어이 :로그/감사 (403 개) 요청

  1. 그들은 로그인하지 않은 경우
  2. 로그인했지만 페이지에 적합한 자격 증명이없는 경우 요청에 대한 정보, 그 사람의 신원, 일부 HttpRequest 항목 등을 기록한 다음 리디렉션하고 싶습니다 특정 무단 액세스 페이지로 이동합니다.

1은 분명히 .net mvc [Authorize] 속성 필터로 처리됩니다. 2 부분적으로 구현했습니다. 기본 HandleUnauthorizedRequest 메서드를 재정 의하여 권한 부여 액션 필터를 확장하여 특정 추가 작업을 확인하고 응답 코드 403을 사용하여 HttpResult를 반환하는 특정 Authorization 특성을 만들었습니다.

저는 다른 부분을 구현하는 데 문제가 있습니다. 데이터베이스에 정보를 로깅합니다. 물론 커스텀 애트리뷰트 자체에서 로깅하는 간단한 해결책이 있습니다.하지만 그건 옳은 생각이 아닙니다. 애트리뷰트 자체를 더 똑똑하게 만드는 것처럼 느껴질 것입니다. 정보를 데이터베이스에 로깅하는 것이 아니라 액세스를 제한하는 방법에 대해 설명합니다.

또 다른 해결책으로는 권한이 부여되지 않은 페이지 자체에 도착할 때 로깅하는 것이 있습니다. 그 자체는 나쁘지는 않지만 여전히 옳은 느낌은 아닙니다.

개인적으로 요청 체인 내 어딘가에서 처리 할 수 ​​있기를 원하지만 가능한 모든 정보에 액세스 할 수있는 곳이 없다는 것을 알 수 있습니다. 나는 여기를 둘러 보았지만 우리가 가고있는 해결책에 맞는 것을 발견하지 못했습니다.

아무에게도 우리가 할 일과 비슷한 것을 구현했거나 구현해야 할 부분에 대한 아이디어가 없습니다.

답변

2

... 새로운 IHttpModule을 만들고 대해 EndRequest 이벤트에서 부정 행위 해커를 기록

일예로

감사합니다, MD

public class UnAuthorizedLoggerHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.EndRequest += ContextOnEndRequest; 
    } 

    private void ContextOnEndRequest(object sender, EventArgs eventArgs) 
    { 
     var app = sender as HttpApplication; 

     if (app == null) return; 

     if (app.Response.StatusCode == (int)HttpStatusCode.Forbidden) 
     { 
      //Log the error 
      //All the user info should be in app.Request 
     } 
    } 
} 
+0

그건 우리가 찾고 있던 것과 똑같습니다. – MDo