svcutil игнорирует утверждения WS-Trust
Сценарий: я пишу клиент 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>
были размещены внутри).
Когда помещено так, svcutil
игнорирует <Claims>
полностью. При размещении в шаблоне RST они копируются в сгенерированный конфиг:
<binding ...>
<security ...>
<issuedTokenParameters ...>
<additionalRequestParameters>
<!-- The RST template is copied here -->
</additionalRequestParameters>
...
</issuedTokenParameters>
</security>
...
</binding>
WCF утверждает (не каламбур) для поддержки WS-SecurityPolicy 1.2, так что мне интересно - это ошибка по замыслу? ИМХО, претензии от политики всегда должны появляться в <additionalRequestParameters>
обязательной конфигурации.
1 ответ
Служба поддержки Microsoft подтвердила мне, что это ошибка в.NET 4.0, и исправление планируется в следующей версии.