2012-10-19 3 views
0

나는 authorize 속성을 기반으로 MvcSiteMapProvider를 사용하고 있으며 AuthorizeAttribute에서 파생 된 새 클래스를 도입 할 때까지 괜찮 았습니다. 주요 차이점은 생성자 서명에 있습니다AuthorizeAttribute 생성자에 매개 변수를 추가하면 MvcSiteMapProvider에서 오류가 발생합니까?

public MyAuthorizeAttribute(param RoleCode[] roles) { 
    Roles = string.join(",", roles.Select(r => r.ToString()); 
} 

그리고 ... MvcSiteMapProvider 같이 예상치 못한 결과 : MyAuthorizeAttribute로 표시 작업 만이 눈에 보이지 않는되었다. 이 생성자를 비활성화하여 확인했습니다. 생성자에 매개 변수를 추가하기 전에 모든 것이 변경되었습니다. 또한 - params 특정 아닙니다 - 모든 매개 변수 (이벤트 int)는 이러한 동작을 유발합니다.

MvcSiteMapProvider 소스에서 알 수 있듯이 권한 부여 특성을 에뮬레이트하는 코드를 내 보냅니다. 외부 코드로 생성 된 어셈블리를 저장할 수없는 것처럼 보입니다. 해결 방법이 있다는 것을 알고 있습니다. 어떤 종류의 열거 형 속성을 사용하지만 생성자 매개 변수로 작업하게 만드는 방법에 대한 제안이 있습니까? MvcSiteMapProvider가 왜 그렇게 작동하는지 알고 있습니까?

답변

0

그래서 디버깅에 시간을 보낸 후 대답을 동적 프록시 실현했습니다.

MVC 프레임 워크에서 요청을 실행하는 동안 AuthorizeAttribute에서 파생 된 클래스가 어떻게 작동하는지 쉽게 알 수있는 방법이 없습니다. 액세스 확인 실패의 경우 일부는 예외를 throw 할 수 있으며 일부는 401 상태 코드를 반환하고 일부는 로그인 페이지로 즉시 리디렉션하는 등의 작업을 수행 할 수 있습니다.

하지만 MvcSiteMapProvides가 그렇게합니다! 클래스 AuthorizeAttribute 경우

  • : 그것은 다음과 같은 해결 방법을 사용
    • 은 매우 간단하다 InternalAuthorize 클래스의 인스턴스를 만듭니다.
    • 거기에있는 모든 속성을 복사하고
    • invoke AuthorizeCore 부울 값을 반환하는 메서드입니다.
      • 속성의 유형에서 파생 된 프록시 클래스를 생성 다른
    • ,
    • 만들 예, 여기 /// < < 우리는 예외를 거기
    • 사본 모든 속성을 얻을
    • 은 부울 값을 반환하는 AuthorizeCore 메서드를 호출합니다. 이 알 수있는 바와 같이

, 즉 생성자 매개 변수를 인식 프록시를 만들 수있는 쉬운 일이 아니다. 물론 기본 생성자 부재에 대한 예외가 발생하지만 빈 catch 절에 의해 소비됩니다. 정말 슬픈 일입니다. 적어도 하나의 디버그 추적으로 2 시간을 절약 할 수있었습니다.

그래서 마침내 답 :

분명히
  • 당신이 어느 곳에서든지 언급하지 왜 오 왜 (매개 변수가없는 속성 생성자를 사용해야합니까?)
  • 사용자 지정 acl 공급자 만들기 : IAclModule 인터페이스를 구현하고 자신의 권한 부여 특성에 대한 지식을 최대한 활용하십시오.
관련 문제