집합에 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입니다.
아이디어가 있으십니까?
클레임은 AfterReceiveRequest 내의 Thread.CurrentPrincipal에서 디버그로 표시됩니까? –
@DanilaPolevshikov, 있습니다. –