2010-08-10 6 views
3

현재 토큰을 발행하는 수동 STS, Silverlight 응용 프로그램을 호스팅하는 웹 사이트 및 Silverlight App 용 WCF 서비스를 사용하는 연합 인증 솔루션을 구현 중입니다.ClaimsPrincipal이 WCF 서비스에 도달하면 null입니다.

은 지금까지 나는 수 있어요 :

  • 는 STS에
  • 로그인을 리디렉션 및 HttpContext.Current.User.Identity as IClaimsIdentity;

에 액세스하여 웹 사이트

  • 디스플레이 웹 사이트의 주장에 리디렉션 웹 사이트의 web.config에서 필요한 두 WIF 모듈을 추가했습니다 (IIS 7에서).

    <modules runAllManagedModulesForAllRequests="true"> 
    
         <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/> 
         <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/> 
    
        </modules> 
    

    또한 ClaimsAuthenticationManager 및 ClaimsAthorizationManager의 자체 구현을 사용하도록 web.config의 Microsoft.IdentityModel 섹션을 구성했습니다.

    <service name="Rem.Ria.PatientModule.Web.WebService.PatientService"> 
         <claimsAuthenticationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthenticationManager"/> 
         <claimsAuthorizationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthorizationManager"/> 
         </service> 
    

    내 ClaimsAuthenticationMAnager는 단순히 Thread.CurrentPrincipal을 설정하는 것으로 유효한 주체가 제공됩니다.

    class RemClaimsAuthenticationManager : ClaimsAuthenticationManager 
        { 
         public override IClaimsPrincipal Authenticate (string resourceName, IClaimsPrincipal incomingPrincipal) 
         { 
    
          if (incomingPrincipal.Identity.IsAuthenticated) 
          { 
           Thread.CurrentPrincipal = incomingPrincipal; 
          } 
          return incomingPrincipal; 
         } 
        } 
    } 
    

    문제는 내 ClaimsAuthorizationManager가 호출 될 때 context.Principal.Identity 주장에 유효한 신원을 포함하지 않는 것이없고, 어느 쪽도 Thread.CurrentPrincipal는 않습니다.

    아이디어가 있으십니까?

  • 답변

    5

    Thread.CurrentPrincipal을 설정하지 않아도되므로 세션 모듈에서이 작업을 수행 할 수 있습니다. Thread.Principal은 일반적으로 IIS에있는 두 개의 다른 모듈이기 때문에 서비스에 액세스하는 스레드와 다른 스레드에서 설정되기 때문에 HttpContext.Current.User를 통해 액세스해야합니다. 다음 도서에서 우리가 Codeplex Site에서 확인할 수있는 예가 있습니다.

    HTH

    1

    다음 샘플 코드 ClaimsAuthenticationManager 상속 견본 클래스이다. 들어오는 IClaimsPrincipal을 수신하고 수정 된 이름 클레임을 제외하고 클레임을 통과합니다. 현재 스레드에서 CurrentPrincipal을 설정하지 않습니다 (예 : 현재 스레드). 다음과 같이

    내 테스트 구현은 다음과 같습니다

    public class CustomClaimsAuthenticationManager : ClaimsAuthenticationManager 
    { 
    public CustomClaimsAuthenticationManager() 
    { 
    
    } 
    
    public override IClaimsPrincipal Authenticate(string resourceName, 
    IClaimsPrincipal incomingPrincipal) 
    { 
        var outgoingIdentity = GetClaimsAsPassthrough(incomingPrincipal); 
        return outgoingIdentity; 
    } 
    
    private IClaimsPrincipal GetClaimsAsPassthrough(IClaimsPrincipal incomingPrincipal) 
    { 
        if (!incomingPrincipal.Identity.IsAuthenticated) 
        { 
         return incomingPrincipal; 
        } 
    
        var ingoingClaims = incomingPrincipal.Identity as IClaimsIdentity; 
    
        ClaimsIdentity outgoingIdentity = new ClaimsIdentity(new List<Claim> 
        { 
         new Claim(ClaimTypes.Name, (incomingPrincipal.Identity.Name + " 
         a very cool guy")) 
        }, incomingPrincipal.Identity.AuthenticationType); 
    
        foreach (var claim in ingoingClaims.Claims.Where(
        c => c.ClaimType != ClaimTypes.Name)) 
        { 
         outgoingIdentity.Claims.Add(claim.Copy()); 
        } 
    
        return new ClaimsPrincipal(new List<ClaimsIdentity> { outgoingIdentity }); 
    } 
    
    } 
    
    관련 문제