ASP.NET MVC 5 앱이 있는데 클레임 승인 라운드를 시작하려고합니다. web.config 파일에 항상 ClaimsAuthorizationManager
클래스를 설정하는 많은 자료를 읽었습니다.코드의 ClaimsAuthorizationManager 설정 (MVC 5)
사용자 정의 ClaimsAuthorizationManager
코드를 설정할 수 있습니까?
ASP.NET MVC 5 앱이 있는데 클레임 승인 라운드를 시작하려고합니다. web.config 파일에 항상 ClaimsAuthorizationManager
클래스를 설정하는 많은 자료를 읽었습니다.코드의 ClaimsAuthorizationManager 설정 (MVC 5)
사용자 정의 ClaimsAuthorizationManager
코드를 설정할 수 있습니까?
. 내 Global.asax 파일에 ApplicationStart 방법에서, 다음 코드를 사용
System.IdentityModel.Services.FederatedAuthentication.FederationConfigurationCreated += (s, e) =>
{
e.FederationConfiguration.IdentityConfiguration.ClaimsAuthorizationManager = new MyCustomClaimsAuthorizationManager();
};
당신은 ServiceConfiguration
클래스를 통해 설정할 수 있어야한다 :
ServiceConfiguration.ClaimsAuthorizationManager = new MyClaimsAuthManager();
문서 : 난 내 자신의 질문에 대답하고 있습니다 http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.configuration.serviceconfiguration.claimsauthorizationmanager.aspx
아마 대답에이 약간 정교 도울 수 누군가 난 그냥 MVC 5, .NET에서 매우 비슷한을 통해 간으로, 밖으로 다른 4.5.2,이 구성 요소가 어떻게 작동하는지 이해할 가치가 있다는 것을 알게되었습니다.
내 주요 목표 : 의존성의 .config 최소화하기 위해 필요 (FFWD을 : 내가, 내가 방법은 최소화하지만, 완전히 제거하지 할 수 발견 한 시간에)
내가이 답변의 접근 방식에 달렸다 문제는 내가있다 오류가 점점 내가 구성 물건을 놓치고 말하고 계속했다. 좋은 옛날 반사경 반사 후, 나는 이것이 정적 getter의 데이지 체인, 인스턴스 생성 및 FederatedAuthentication
, FederationConfiguation
및 IdentityConfigution
클래스 사이의 멤버 초기화로 인해 발생한다는 것을 발견했습니다.
먼저 FederatedAuthentication
클래스의 FederationConfiguration
getter 속성은 기본 'FederationConfiguration'필드를 초기화합니다.
public static FederationConfiguration FederationConfiguration
{
get
{
if (_federationConfiguration == null)
{
object federationConfigurationLock = FederationConfigurationLock;
lock (federationConfigurationLock)
{
if (_federationConfiguration == null)
{
_federationConfiguration = CreateFederationConfiguration();
}
}
}
return _federationConfiguration;
}
}
이 초기화 루틴 요약 : 코드가 처리되는,
FederatedConfiguration
기본 ctor에 (: this(true)
에 호출하지만 난 빗나가 다) 및 무엇이든 할 수 있습니다.아직 초기화하지 않은 경우 시작 그것은 (적어도 나에게) 외부 식별 할 수없는 때문에이 루틴을 이해 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();
을; 불행히도 나를 위해, 이것은 내가 성취하려는 것을 위해 충분하지 않았습니다. 잘하면 이것이 "단순한 대답"으로는 충분하지 않은 다른 사람을 도울 수 있습니다.
SimonC, <.net 4.5입니다. 나는 .net4.5 + 클래스를 찾을 수 없다. –