Я использую Microsoft.IdentityModel.dll
для Set & Получите претензии в WCF
. Я также внедрил MessageInspectors
для создания претензий. Итак, я добавляю ClaimsIdentity
для заголовков запросов, как показано ниже с клиентской стороны.Претензии в Thread.CurrentPrincipal теряются, которые установлены в AfterReceiveRequest в WCF
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;
}
Я пытаюсь получить доступ к значениям претензии в реализации метода (OperationContract
), которые устанавливаются в AfterReceiveRequest
, как показано ниже. Но претензии не доступны в Thread.CurrentPrincipal
.
var userIdClaim = ((IClaimsIdentity)Thread.CurrentPrincipal.Identity).Claims.First(c => c.ClaimType == UserIdClaim);
userIdClaim
null здесь.
Любые идеи?
Является ли заявка показанной отладкой в Thread.CurrentPrincipal внутри AfterReceiveRequest? –
@ ДанилаПолевщиков, она имеет. –