2009-04-30 8 views
19

stworzyłem pełnomocnika usługi sieci Web z Visual Studio 2008 i stworzony dla mnie następujący wpis w app.config:Połącz z WCF do usługi WebService uwierzytelnionego się podając nazwę użytkownika/hasło

<system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="MyNameHandlerSoapBinding" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://www.***/***/***" 
       binding="basicHttpBinding" bindingConfiguration="MyNameHandlerSoapBinding" 
       contract="***.MyNameHandler" name="MyName"> 
      </endpoint> 
     </client> 
    </system.serviceModel> 

Webservice ma uwierzytelnianie za pomocą nazwy użytkownika/hasła, więc muszę dodać ją gdzieś tutaj.

Jestem trochę zagubiony w morzu dokumentacji WCF, myślę, że muszę zmienić z basicHttpBinding na wsHttpBinding lub customBinding, aby móc dodać elementy uwierzytelniające, ale tak naprawdę nie rozumiem tego. Czy ktokolwiek mógłby podać jakąś szybką wskazówkę lub przydatne łącze, które mówi, jak to zrobić?

EDIT:

Zmieniłem sekcję zabezpieczeń:

<security mode="Transport"> 
    <transport clientCredentialType="Basic" proxyCredentialType="None" 
     realm="" /> 
</security> 

i dodaje w kodzie:

ws.ClientCredentials.UserName.UserName = ""; 
ws.ClientCredentials.UserName.Password = ""; 

teraz wydaje się to może być przy użyciu poświadczeń, ale to podając mi błąd:

dostarczony schemat URI „http” jest nieprawidłowy URI oczekiwano „https”

ja nawet nie wiem, czy jest to właściwa droga ...

+3

WCF to piekło konfiguracji. Z jakiego sklepu autorskiego chcesz korzystać? Windows ... Członkostwo ASP lub niestandardowe jak baza danych? I przejrzałeś to: http://msdn.microsoft.com/en-us/library/bb398990.aspx –

+0

Rzeczywiście. Jest to zewnętrzna usługa sieciowa, która ma unikalną nazwę użytkownika/hasło do użytku zawsze dla wszystkich moich połączeń. I to jest http. Sądzę więc, że może to być więcej autoryzacji punktu końcowego, jeśli ma to sens! – antonioh

+0

Na początku jest niepokojące, że nie możesz podać nazwy użytkownika i hasła w dowolnym miejscu w konfiguracji (ale tylko w kodzie) - czy znowu chciałbyś mieć hasło w pliku konfiguracyjnym z czystym tekstem? NAPRAWDĘ? –

Odpowiedz

34

zamieścić tutaj rozwiązanie dla przyszłych czytelników:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="MyHandlerSoapBinding" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://www.***/***/***/MyHandler" 
      binding="basicHttpBinding" bindingConfiguration="MyHandlerSoapBinding" 
      contract="***.MyHandler" name="MyHandler"> 
     </endpoint> 

    </client> 
    </system.serviceModel> 

w końcu mogłem użyć domyślnego BasicHttpBinding. Jedyną różnicą w stosunku do kodu opublikowanego w pytaniu jest węzeł bezpieczeństwa.

pamiętać także trybu = opcję „TransportCredentialOnly”, to pozwala na wysyłanie login/hasło używając http zamiast https. Jest to konieczne do testowania środowisk, z których korzystam. Później oczywiście będziesz wolał https wysłać swoje poświadczenia.

Następnie w kodzie będziesz wprowadzić swoją nazwę użytkownika/hasło:

var ws = new ***.MyHandlerClient("MyHandler"); 
ws.ClientCredentials.UserName.UserName = "myUsername"; 
ws.ClientCredentials.UserName.Password = "myPassword"; 
var result = ws.executeMyMethod(); 
+0

To naprawdę sprawiło, że mój dzień! Wielkie dzięki za dzielenie się, to uratowało wielu ludziom wiele problemów. – cudahead

+0

@antonioh Otrzymuję 'Żądanie HTTP było zabronione ze schematem uwierzytelniania klienta" Basic'. "Z tym podejściem; czy wiesz, co może być przyczyną tego? – FMFF

+0

Argh ... kto by znalazł ... Nazwa użytkownika. NazwaUżytkownika .... –

5

Komunikat o błędzie ma rację. WCF nie zezwala na transport nazw użytkowników i haseł za pośrednictwem niezabezpieczonego protokołu. Twój serwis internetowy musi być używany przez HTTPS (z towarzyszącym certyfikatem SSL)

Po uzyskaniu certyfikatu SSL masz dwie opcje dotyczące sposobu wysyłania poświadczeń, transportu lub bezpieczeństwa oraz wiele opcji dla typu poświadczenia. MSDN ma good guide dla wszystkich różnych opcji.

+1

Znaleziono. To pozwala ci z opcją . Oczywiście chodzi o środowisko testowe, później powinieneś użyć https. Pozdrawiam – antonioh

1

miałem ten sam problem i próbował rozwiązanie powyższej Jakoś to nie działa dla mnie byłem wciąż otrzymuję komunikat " Nie znaleziono nagłówka WS-Security "

Po długim okresie testowania i próbowaniu udało mi się go wykonać. Dodałem kod nagłówka do klienta, jak poniżej, a następnie działa!

<client> 
    <endpoint address="http://your.service.com" binding="basicHttpBinding" bindingConfiguration="XXXBinding" contract="contract.XXX" name="XXXPort"> 
     <headers xmlns:wsse="http://your.xsd"> 
      <wsse:Security mustUnderstand="1"> 
       <wsse:UsernameToken> 
        <tenant>XXX</tenant> 
        <wsse:Username>XXX</wsse:Username> 
        <wsse:Password Type="http://www.xxxx.com/wss#PasswordText">XXX</wsse:Password> 
       </wsse:UsernameToken> 
      </wsse:Security> 
     </headers> 
    </endpoint> 
</client> 
Powiązane problemy