3

VS 2012/.NET 4.5/ASP.NET MVC 4 응용 프로그램에서 ClaimsIdentity에서 파생 된 사용자 지정 ID 유형이 있습니다. 그것은 단지 편의를 위해 일부 주장에서 값을 읽을 기본 클래스에 몇 가지 읽기 전용 속성 추가 : 나는 위의 정체성을 감싸는 주에 들어오는 주체를 변환 ClaimsAuthenticationManager 사용자 정의에서잘못된 유형의 ClaimsIdentity 작업자 프로세스 리사이클 후 세션 쿠키에서 읽음

public class AppIdentity : ClaimsIdentity 
{ 
    public AppIdentity(IEnumerable<Claim> claims) : base(claims, "Custom") 

    public string CustomProp { get { return FindFirst("CustomClaim").Value; } } 
    // etc. 
} 

을, 이것에 대한 토큰을 생성 원금과 쿠키에 토큰을 쓰기 :

var claims = new List<Claim> 
{ 
    new Claim("CustomClaim", "CustomValue"), 
    // etc. 
}; 
var newPrincipal = new ClaimsPrincipal(new AppIdentity(claims)); 
var sessionToken = new SessionToken(newPrincipal, TimeSpan,FromHours(24)); 
FederatedAuthentication.SessionAuthenticationModule 
    .WriteSessionTokenToCookie(sessionToken); 

내가 지금 같은 컨트롤러 액션의 후속 요청에 대한 신원을 가져 오는 경우 ...

var identity = ClaimsPrincipal.Current.Identity; 

... 때로는 identity의 런타임 유형이 AppIdentity이고 경우에 따라 기본 형식이 ClaimsIdentity 인 경우가 있습니다. 내 사용자 정의 클레임은 항상 Claims 컬렉션 identity 안에 있습니다.

작업자 프로세스가 재활용 될 때 ID가 "012"를 잃는 것처럼 보입니다. 지금은이 프로젝트에서 IIS Express 개발 서버만을 사용하고 있으며, 예를 들어 web.config에서 약간의 변경을 가하면이 동작을 강제로 수행 할 수 있습니다. 그런 다음 ID는 항상 ClaimsIdentity이고 AppIdentity이 아닌 유형입니다.

질문 : 사용자 지정 클레임 ID 유형을 쿠키에 잘못 저장했거나 지원되지 않을 수도 있습니다. 세션 쿠키는 파생 된 ClaimsIdentity의 형식 정보를 저장합니다 (쿠키에서 올바른 ID 유형을 구체화하는 데 필요한 것일 수 있습니다).

답변

0

당신은 교장에 들어오는 신원을 확인하는 간단한 HttpModule을 구현할 수 있으며, 자신의 구현

public class MyClaimsAuthenticationModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PostAuthenticateRequest += Context_PostAuthenticateRequest; 

    } 

    public void Dispose() 
    { 
     // Nothing to dispose, method required by IHttpModule 
    } 

    void Context_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     var transformer = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager; 
     if (transformer != null) 
     { 
      var context = ((HttpApplication)sender).Context; 
      var principal = context.User as ClaimsPrincipal; 

      var oo = principal.Identity is DaIdentity; 
      if (!oo) 
       principal = new ClaimsPrincipal(new DaIdentity(principal.Identity as ClaimsIdentity)); 

      var transformedPrincipal = transformer.Authenticate(context.Request.RawUrl, principal); 

      context.User = transformedPrincipal; 
      Thread.CurrentPrincipal = transformedPrincipal; 
     } 
    } 
} 

그리고 웹에 등록로 변환 : 나는 여기에 대해 썼다. 이 설정은

<modules runAllManagedModulesForAllRequests="true"> 

     <add name="TestAuthenticationModule" Type="MyAssemby.MyClaimsAuthenticationModule, MyAssembly" preCondition="managedHandler" /> 



     <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
     <add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
     <remove name="FormsAuthentication" /> 
     <remove name="WebDAVModule" /> 
    </modules> 
관련 문제