Diskuze: úprava soap správy cez BeforeSendRequest

C# .NET .NET (C# a Visual Basic) úprava soap správy cez BeforeSendRequest American English version English version

Avatar
peter.hudak15:

Zdravím,
snažím sa upraviť text soap správy odosielanej na webservice, pretože ju potrebujem pred odoslaním ešte podpísať.
Snažím sa dostať ku xml textu mojej odosielanej soap požiadavky cez iClientMessage­Inspector podľa tohto návodu: http://wcfpro.wordpress.com/…geinspector/
Pred volaním metódy webovej služby som ešte aby to fungovalo pridal do endpointu "MyBehavior".
U jednej skúšobnej webovej služby mi toto riešenie fungovalo - čiže zavolaním metódy vebovej služby mi to pri debugovaní skočilo do metódy BeforeSendRequ­est(...), no pri inej, tej u ktorej to telo potrebujem podpísať, mi toto riešenie nefunguje a neskočí mi to do BeforeSendRequest, len mi vyhodí výnimku

The request message must be protected. This is required by an operation of the contract

. A teraz neviem či tú správu treba ešte nejako "ochrániť" a preto vyhodí výnimku ešte predtým ako by sa mala požiadavka odoslať a skočiť do BeforeSendRequest alebo mi tam nechce skočiť z nejakého iného dôvodu ja ju tým pádom nemôžem podpísať a preto mi vyhodí výnimku?
Viete mi prosím vás niekto pomôcť?

 
Odpovědět 3.12.2013 11:06
Avatar
peter.hudak15:

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/').
 
Nahoru Odpovědět 3.12.2013 11:17
Avatar
coells
Redaktor
Avatar
Odpovídá na peter.hudak15
coells:

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/sig­nature

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.

 
Nahoru Odpovědět 3.12.2013 11:26
Avatar
peter.hudak15:

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é:

  • telo správy,
  • token mena/hesla používateľa,
  • časová pečiatka,
  • špecifikácia názvu metódy webovej služby,
  • špecifikácia odosielateľa,
  • identifikátor správy,
  • špecifikácia cieľovej adresy služby
Editováno 3.12.2013 13:21
 
Nahoru Odpovědět 3.12.2013 13:20
Avatar
coells
Redaktor
Avatar
Odpovídá na peter.hudak15
coells:

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.

 
Nahoru Odpovědět 3.12.2013 14:07
Avatar
peter.hudak15:

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.

 
Nahoru Odpovědět 3.12.2013 15:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.