2009-04-30 20 views
19

Tôi tạo ra một proxy của một dịch vụ Web với Visual Studio 2008, và nó tạo cho tôi các mục sau đây trong app.config:Kết nối với WCF để một WebService chứng thực với username/password

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

Các webservice có xác thực tên người dùng/mật khẩu vì vậy tôi cần thêm nó ở đâu đó ở đây.

Tôi bị mất một chút trong biển tài liệu WCF, tôi nghĩ tôi phải thay đổi từ basicHttpBinding thành wsHttpBinding hoặc customBinding để có thể thêm các phần tử xác thực, nhưng tôi thực sự không hiểu nó. Ai có thể đưa ra bất kỳ mẹo nhanh hay bất kỳ liên kết hữu ích nào nói cách làm như vậy không?

EDIT:

tôi đã thay đổi phần bảo mật:

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

và thêm vào đoạn code:

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

Bây giờ có vẻ như nó có thể được sử dụng thông tin nhưng nó cho tôi lỗi:

URI chương trình cung cấp 'http' không hợp lệ URI dự kiến ​​'https'

Tôi thậm chí không biết nếu điều này là đúng cách để đi ...

+3

WCF là địa hình cấu hình. Bạn muốn sử dụng cửa hàng auth nào? Windows ... ASP thành viên hoặc tùy chỉnh như một cơ sở dữ liệu? Và bạn đã xem qua điều này: http://msdn.microsoft.com/en-us/library/bb398990.aspx –

+0

Thật vậy. Đó là một dịch vụ web bên ngoài có tên người dùng/mật khẩu duy nhất để sử dụng luôn cho tất cả các cuộc gọi của tôi. Và nó là http. Vì vậy, tôi đoán nó có thể được nhiều hơn một ủy quyền điểm cuối, nếu điều đó có ý nghĩa! – antonioh

+0

Lúc đầu, bạn không thể chỉ định tên người dùng và mật khẩu ở bất cứ nơi nào trong cấu hình (nhưng chỉ trong mã) - sau đó một lần nữa, bạn có muốn có mật khẩu trong một tệp cấu hình rõ ràng không? CÓ THẬT KHÔNG? –

Trả lời

34

tôi gửi ở đây là giải pháp cho độc giả trong tương lai:

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

Cuối cùng tôi có thể sử dụng basicHttpBinding mặc định. Sự khác biệt duy nhất từ ​​mã được đăng trong câu hỏi là nút bảo mật .

Cũng lưu ý chế độ = "TransportCredentialOnly" tùy chọn, điều này cho phép bạn gửi tên người dùng/mật khẩu sử dụng http thay vì https. Điều này là cần thiết cho các môi trường thử nghiệm như là một trong những tôi đang sử dụng. Sau đó rõ ràng bạn sẽ thích https để gửi thông tin đăng nhập của mình.

Sau đó trong mã bạn sẽ nhập tên tài khoản của bạn/mật khẩu:

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

Điều này thực sự làm cho ngày của tôi! Cảm ơn rất nhiều vì đã chia sẻ, điều này đã cứu rất nhiều người gặp nhiều rắc rối. – cudahead

+0

@antonioh Tôi nhận được 'Yêu cầu HTTP bị cấm với lược đồ xác thực ứng dụng 'Basic'.' với cách tiếp cận đó; bạn có biết điều gì có thể gây ra điều này không? – FMFF

+0

Argh ... người đã tìm thấy ... UserName.UserName .... –

5

Các thông báo lỗi là đúng. WCF sẽ không cho phép vận chuyển tên người dùng và mật khẩu qua giao thức không được bảo vệ. Dịch vụ web của bạn phải đang sử dụng HTTPS (với chứng chỉ SSL attendant)

Khi bạn có chứng chỉ SSL, bạn có hai tùy chọn về cách thông tin đăng nhập được gửi, vận chuyển hoặc bảo mật và nhiều tùy chọn cho loại thông tin xác thực. MSDN có good guide cho tất cả các tùy chọn khác nhau.

+1

Tìm thấy nó. Nó cho phép bạn với tùy chọn . Tất nhiên đây là một môi trường thử nghiệm, sau này bạn nên sử dụng https. Chúc mừng – antonioh

1

tôi đã cùng một vấn đề và cố gắng giải pháp trên Bằng cách nào đó điều này không làm việc cho tôi tôi đã tiếp tục nhận được thông báo " Không tìm thấy tiêu đề WS-Security nào "

Sau một thời gian dài kiểm tra và cố gắng quản lý để làm việc đó Tôi đã thêm mã tiêu đề trong ứng dụng như sau và sau đó nó hoạt động!

<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> 
Các vấn đề liên quan