Сценарий: я пишу клиент WCF для доступа к веб-сервису Java / Metro, который требует аутентификации через токен, полученный из STS (также Java / Metro). Соответствующий фрагмент политики из WSDL службы:
<sp:IssuedToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> <sp:Issuer> <wsa:Address>...</wsa:Address> <Metadata xmlns="http://www.w3.org/2005/08/addressing"> <Metadata xmlns="http://schemas.xmlsoap.org/ws/2004/09/mex"> <MetadataSection> <MetadataReference> <Address xmlns="http://www.w3.org/2005/08/addressing">...</Address> </MetadataReference> </MetadataSection> </Metadata> </Metadata> </sp:Issuer> <t:Claims Dialect="http://schemas.xmlsoap.org/ws/2005/05/identity"> <ClaimType xmlns="http://schemas.xmlsoap.org/ws/2005/05/identity" Optional="false" Uri="..."/> <ClaimType xmlns="http://schemas.xmlsoap.org/ws/2005/05/identity" Optional="false" Uri="..."/> </t:Claims> <sp:RequestSecurityTokenTemplate> <t:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/SymmetricKey</t:KeyType> <t:KeySize>256</t:KeySize> </sp:RequestSecurityTokenTemplate> <wsp:Policy> <sp:RequireDerivedKeys/> <sp:RequireInternalReference/> </wsp:Policy> </sp:IssuedToken>
Обратите внимание на <Claims> часть вне * <RequestSecurityTokenTemplate>, как определено в WS-SecurityPolicy 1.2 (это изменилось по сравнению с предыдущей версией, где <Claims> был помещен внутри).
<Claims>
<RequestSecurityTokenTemplate>
При таком размещении svcutil полностью игнорирует <Claims>. При размещении в шаблоне RST они копируются в сгенерированный конфиг:
svcutil
<binding ...> <security ...> <issuedTokenParameters ...> <additionalRequestParameters> <!-- The RST template is copied here --> </additionalRequestParameters> ... </issuedTokenParameters> </security> ... </binding>
WCF утверждает (не каламбур) для поддержки WS-SecurityPolicy 1.2 , так что мне интересно - это ошибка по замыслу? ИМХО, утверждения из политики должны всегда появляться в <additionalRequestParameters> конфигурации привязки.
<additionalRequestParameters>
Служба поддержки Microsoft подтвердила мне, что это ошибка в .NET 4.0, и исправление планируется в следующей версии.