2014-01-26 1 views
2

ASP.NET MVC 5 앱이 있는데 클레임 승인 라운드를 시작하려고합니다. web.config 파일에 항상 ClaimsAuthorizationManager 클래스를 설정하는 많은 자료를 읽었습니다.코드의 ClaimsAuthorizationManager 설정 (MVC 5)

사용자 정의 ClaimsAuthorizationManager 코드를 설정할 수 있습니까?

답변

2

. 내 Global.asax 파일에 ApplicationStart 방법에서, 다음 코드를 사용

System.IdentityModel.Services.FederatedAuthentication.FederationConfigurationCreated += (s, e) => 
     { 

      e.FederationConfiguration.IdentityConfiguration.ClaimsAuthorizationManager = new MyCustomClaimsAuthorizationManager(); 
     }; 
2

아마 대답에이 약간 정교 도울 수 누군가 난 그냥 MVC 5, .NET에서 매우 비슷한을 통해 간으로, 밖으로 다른 4.5.2,이 구성 요소가 어떻게 작동하는지 이해할 가치가 있다는 것을 알게되었습니다.

내 주요 목표 : 의존성의 .config 최소화하기 위해 필요 (FFWD을 : 내가, 내가 방법은 최소화하지만, 완전히 제거하지 할 수 발견 한 시간에)

내가이 답변의 접근 방식에 달렸다 문제는 내가있다 오류가 점점 내가 구성 물건을 놓치고 말하고 계속했다. 좋은 옛날 반사경 반사 후, 나는 이것이 정적 getter의 데이지 체인, 인스턴스 생성 및 FederatedAuthentication, FederationConfiguationIdentityConfigution 클래스 사이의 멤버 초기화로 인해 발생한다는 것을 발견했습니다.

먼저 FederatedAuthentication 클래스의 FederationConfiguration getter 속성은 기본 'FederationConfiguration'필드를 초기화합니다.

public static FederationConfiguration FederationConfiguration 
{ 
    get 
    { 
     if (_federationConfiguration == null) 
     { 
      object federationConfigurationLock = FederationConfigurationLock; 
      lock (federationConfigurationLock) 
      { 
       if (_federationConfiguration == null) 
       { 
        _federationConfiguration = CreateFederationConfiguration(); 
       } 
      } 
     } 
     return _federationConfiguration; 
    } 
} 

이 초기화 루틴 요약 : 코드가 처리되는,

  • 의 화재 'FederationConfigurationCreated'이벤트를

    1. 전화 FederatedConfiguration 기본 ctor에 (: this(true)에 호출하지만 난 빗나가 다) 및 무엇이든 할 수 있습니다.
    2. 조명 확인
    3. 아직 초기화하지 않은 경우 시작 그것은 (적어도 나에게) 외부 식별 할 수없는 때문에이 루틴을 이해 alization 체인

      private static FederationConfiguration CreateFederationConfiguration() 
      { 
          System.IdentityModel.Services.Configuration.FederationConfiguration federationConfiguration = new System.IdentityModel.Services.Configuration.FederationConfiguration(); 
           federationConfiguration = OnFederationConfigurationCreated(federationConfiguration); 
           if (federationConfiguration.IsAmbiguous) 
           { 
            throw DiagnosticUtil.ExceptionUtil.ThrowHelperError(new ConfigurationErrorsException(System.IdentityModel.Services.SR.GetString("ID7018"))); 
           } 
           if (!federationConfiguration.IsInitialized) 
           { 
            federationConfiguration.Initialize(); 
           } 
           return federationConfiguration; 
          } 
      } 
      

    중요하다 당신이 훅은 이벤트에했고, 약간의 오프 - 더 - 예약 물건을 당신을 시도하는 경우 FederationConfig 및/또는 IdentityConfig 클래스 'Initialize() 방법 중 하나를 호출하여 다른 방법으로 호출 될 경우 발생하는 부작용을 피할 수 있어야합니다. 객체의 사슬을 실행 인해 구현이 클래스의 IsInitialized 속성은 true 경우 자신의 Initialize() 방법이 성공적으로 완료를 반환하도록 설정 될 수있다 "초기화되어 있지 않은 경우, Initialize 전화"의 패턴이 있습니다

    .

    내 사용자 정의 ConfigurationManager를 설정하고 의존성의 .config로 인해 약간의 오류를 방지 할 수 있었다 방법은 선제 IdentityConfiguration 개체에 Initialize() 메소드를 호출 할만큼 똑똑 내 이벤트 핸들러을했다 -이 실제로 내에서 실행 경로를 변경 프레임 워크의 IdentityModel 클래스

    var authZ = new MyClaimsAuthorizationManager();    
    
    FederatedAuthentication.FederationConfigurationCreated += (s, e) => 
    { 
        var identityConfiguration = e.FederationConfiguration.IdentityConfiguration; 
    
        identityConfiguration.ClaimsAuthorizationManager = authZ; 
    
        if (!identityConfiguration.IsInitialized) 
         identityConfiguration.Initialize(); 
        }; 
    } 
    

    프로그래밍 간단한 LOC했다 모두이 설정하는 방법에 말을 몇 블로그/SO 답변있다 : 이벤트 처리기에서 e.FederationConfiguration.IdentityConfiguration.ClaimsAuthorizationManager = new MyCustomClaimsAuthorizationManager();을; 불행히도 나를 위해, 이것은 내가 성취하려는 것을 위해 충분하지 않았습니다. 잘하면 이것이 "단순한 대답"으로는 충분하지 않은 다른 사람을 도울 수 있습니다.