1

Я использую 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 здесь.

Любые идеи?

+0

Является ли заявка показанной отладкой в ​​Thread.CurrentPrincipal внутри AfterReceiveRequest? –

+0

@ ДанилаПолевщиков, она имеет. –

ответ

0

Возможно, у вас есть веские причины для этого, но передача идентификатора в wcf осуществляется из коробки с помощью wsFederationHttpBinding. Примеры можно найти в WIF SDK или в Интернете по адресу http://msdn.microsoft.com/nl-be/library/aa355045.aspx.

+0

@willyWilly Van den Driessche, это не связано с привязкой .. –

3

Ну, кроме того, что вы делаете, очень необычная практика - в конвейере WCF есть только одно место, где вы можете безопасно установить Thread.CurrentPrincipal. Это находится в диспетчере авторизации службы, когда для параметра PrincipalPermissionMode установлено значение «Пользовательский».

Обычно вы предпочитаете передавать претензии как часть токена безопасности (например, SAML), а WCF - для вас.

+2

для чего именно? – leastprivilege

+0

Любые примеры кода для реализации этого или любых блогов, которые объяснят подробные данные? Я не получил четкой картины. –

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^