Diskuze: úprava soap správy cez BeforeSendRequest
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
akosi sa mi vytratil ešte zvyšok textu vínimky takže:
The request message must be protected. This is required by an operation of the contract ('NazovSluzbyContract','http://nejakywebovyOdkaz'). The protection must be provided by the binding ('CustomBinding','http://tempuri.org/').
WCF stub, který jsi pro službu vygeneroval, má na contractu specifikováno, že zpráva musí být encrypted nebo signed. Přesně tohle se říká v té výjimce, kterou jsi poslal:
The request message must be protected. This is required by an operation of the contract
protected = encrypted
required by operation = je tam atribut vyžadující encryption/signature
Tvoje zkušební služba, u které to funguje, dost pravděpodobně nic takového nevyžaduje, ale bude také nejspíš ignorovat příchozí podpisy.
WS-Signature bys měl nechat na WCF frameworku, není to nic jednoduchého to napsat správně. Jedinou výjimkou je, pokud službu nabízí jiná strana a má chybně implementovanou WS-Security specifikaci (například JSpring je špatně).
Ideálně přestaň dělat podpisy ručně a v konfiguraci nastav wsHttpBinding. Na WCF stubu služby použij signed/not-encrypted atribut a nemusíš se o nic starat.
Vďaka za odpoveď,
takže skusmo som nahradil customBinding za wsHttpBinding a už ma pekne hodí
do BeforeSendRequest, lenže podľa tvojho príspevku by som to nemál riešiť
ručne tak by som chcel dať na tvoju radu. Som v tom WS-Signature trochu mimo,
už to dlhšie lúskam no stále mám v tom guláš.
Chcem sa teda spýtať:
1.môžem nahradiť ten customBinding za wsHttpBinding, napriek tomu, že
customBinding bol vygenerovaný cez wdsl?
2.Prosím ťa taká lamerska otázka ako resp. kde mám použiť ten
signed/not-encrypted atribút
3.Myslíš teda, že to automaticky všetko správne podpíše a bude stačiť
len nastaviť certifikát do credentials alebo ako bude vedieť čím to má
podpísať a čo všetko sa má podpísať. Tieto všetky veci by mali byť
podpísané:
Protože nevím, jak vypadá WSDL ani Policy, tak na většinu otázek nedokážu takhle odpovědět.
Tvůj problém primárně spočívá v tom, že na vygenerovaném interfacu pro WCF službu máš použitý jeden z těchto atributů:
[ServiceContract(ProtectionLevel = ProtectionLevel.Sign)]
[OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
Pokud je smažeš, už by ti měl ten aktuální klient fungovat s customBindingem.
Na to, aby se automaticky podepsaly headers v SOAP zprávě musíš použít MessageContracty, příklad:
[System.ServiceModel.MessageContract()]
public partial class requestZadost
{
[System.ServiceModel.MessageHeader(ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign)]
public UserTokenHeader userToken;
[System.ServiceModel.MessageBodyMember(Name="request", Namespace="http://foo.com/", ProtectionLevel = System.Net.Security.ProtectionLevel.Sign)]
public requestType requestBody;
}
UserToken bude podepsaný a šifrovaný, ale Body bude jen podepsané. Pokud je v konfiguraci nastavená wsHttpBinding, udělá WCF všechno samo.
A teď k dalšímu problému - customBinding generuje WCF v případě, že na straně služby je něco "jinak". Takže s velice vysokou pravděpodobností tomu WCF nerozumí a snaží se z toho zotavit nejlépe, jak to jde (a většinou mu to nejde).
Takže to chce projít celou konfiguraci a zkontrolovat, jestli je všechno v pořádku a sedí to. wsBinding by měl udělat to, co chceš sám.
Další varianta je nastavit pouze httpBinding, smazat atributy ProtectionLevel z interfacu služby a udělat signatury přes interceptory, jak to děláš. Ale musíš být velice opatrný s XML, protože se podepisuje byte[]. XML musí být normalizované a nesmí se s ním hýbat. Také musíš dodat X509 certifikáty a vložit je buď do zprávy nebo je ve zprávě identifikovat přes reference podle požadavků služby.
Jak říkám, dělat tohle ručně není snadná záležitost. Pokud je služba od někoho jiného, pak bych je požádal o součinnost a zeptal se, jestli mají ověřenou kompatibilitu se C# a WCF.
OK, vyzerá to tak, že budem musieť asi skúsim požiadať o pomoc zo strany služby. Zatiaľ ti veľmi pekne ďakujem za objasnenie.
Zobrazeno 6 zpráv z 6.