1

집합에 Microsoft.IdentityModel.dll을 사용합니다. & WCF의 클레임을 가져옵니다. 클레임 설정을 위해 MessageInspectors을 구현했습니다. 그래서 클라이언트 측에서 아래와 같이 요청 헤더에 ClaimsIdentity을 추가합니다.Thread.CurrentPrincipal의 클레임이 WCF의 AfterReceiveRequest에 설정되어 있습니다.

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
{ 
    var claims = new List<Claim> { new Claim(UserIdClaim, "12345"), }; 
    ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims); 
    MessageHeader<ClaimsIdentity> header = new MessageHeader<ClaimsIdentity>(claimsIdentity); 
    var untypedHeader = header.GetUntypedHeader(ClaimsName, ClaimsNameSpace); 
    request.Headers.Add(untypedHeader); 

    return null; 
} 

서비스 측

public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) 
{ 
    ClaimsIdentity claimsIdentity = request.Headers.GetHeader<ClaimsIdentity>(ClaimsName, ClaimsNameSpace); 
    var claimsIdentitylst = new ClaimsIdentityCollection(new List<IClaimsIdentity> { claimsIdentity }); 
    IClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentitylst); 
    Thread.CurrentPrincipal = claimsPrincipal; 

    return null; 
} 

I는 이하와 같이 설정된다 AfterReceiveRequest 방법의 구현 (OperationContract)에있어서의 값에 액세스하는 것을 시도하고있다. 그러나 클레임은 Thread.CurrentPrincipal에 없습니다.

var userIdClaim = ((IClaimsIdentity)Thread.CurrentPrincipal.Identity).Claims.First(c => c.ClaimType == UserIdClaim); 

은 null입니다.

아이디어가 있으십니까?

+0

클레임은 AfterReceiveRequest 내의 Thread.CurrentPrincipal에서 디버그로 표시됩니까? –

+0

@DanilaPolevshikov, 있습니다. –

답변

0

wcf에서 신원 정보 전달은 wsFederationHttpBinding을 사용하여 즉시 처리됩니다. WIF SDK 또는 온라인 http://msdn.microsoft.com/nl-be/library/aa355045.aspx에서 예제를 찾을 수 있습니다.

+0

@willyWilly Van den Driessche, 이것은 바인딩과 아무 관련이 없습니다. –

3

글쎄 - 당신이하는 일은 매우 드문 연습입니다. WCF 파이프 라인에는 Thread.CurrentPrincipal을 안전하게 설정할 수있는 곳이 하나 밖에 없습니다. PrincipalPermissionMode가 Custom으로 설정된 경우 이는 서비스 권한 부여 관리자에 있습니다.

일반적으로 SAML과 같은 보안 토큰의 일부로 클레임을 전달하고 WCF가 서버 측 배관을 수행하도록합니다.

+2

정확히 무엇입니까? – leastprivilege

+0

구체적으로 설명 할 블로그 또는 블로그를 구현할 코드 샘플은 무엇입니까? 나는 명확한 그림을 얻지 못했다. –

+0

http://leastprivilege.com/2007/08/08/custom-principals-and-wcf/ – leastprivilege