2011-07-14 28 views
5

Có thể sử dụng 2 loại xác thực: cửa sổ và Tên người dùng trong wcf, sử dụng Chế độ bảo mật thư và chứng chỉ để xác thực. xác thực UserName My cfg/mã trông:
server cfg:
WCF Xác thực hỗn hợp Tên người dùng và WIndows

<?xml version="1.0"?> 
    <configuration> 
<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceCredentialsBehavior"> 
       <serviceCredentials> 
        <serviceCertificate findValue="cn=cool" storeName="TrustedPeople" storeLocation="CurrentUser" /> 
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Util.CustomUserNameValidator, Util" /> 
       </serviceCredentials> 
       <serviceMetadata httpGetEnabled="true" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="ServiceCredentialsBehavior" name="Service"> 
      <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MessageAndUserName" name="SecuredByTransportEndpoint" contract="IService"/> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="MessageAndUserName"> 
       <security mode="Message"> 
        <message clientCredentialType="UserName"/> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client/> 
</system.serviceModel> 
<system.web> 
    <compilation debug="true"/> 
</system.web> 
</configuration> 

Khách hàng cfg:

<?xml version="1.0" encoding="utf-8"?> 
    <configuration> 
<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="LocalCertValidation"> 
       <clientCredentials> 
        <serviceCertificate> 
         <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" /> 
        </serviceCertificate> 
       </clientCredentials> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IService" > 
       <security mode="Message"> 
        <message clientCredentialType="UserName" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:48097/WCFServer/Service.svc" 
        binding="wsHttpBinding" 
        bindingConfiguration="WSHttpBinding_IService" 
        contract="ServiceReference1.IService" 
        name="WSHttpBinding_IService" behaviorConfiguration="LocalCertValidation"> 
      <identity> 
       <dns value ="cool" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 
</configuration> 

gì thay đổi, máy chủ để biết cửa sổ sắc mà truy cập vào nó?

Trả lời

1

Câu hỏi thú vị! Nếu bạn thực sự cần có kết hợp xác thực, bạn có thể thử đặt phương tiện vận chuyển là một loại xác thực và thông báo là loại khác. Tôi không biết liệu điều này có hiệu quả hay không, nhưng có vẻ hợp lý khi bạn có thể cấu hình chúng một cách riêng biệt :)

Bạn có thể thấy điều gì đó tương tự như dưới đây. wsHttpBinding có thể xử lý các thông tin đăng nhập windows).

<security mode="Transport"> 
     <transport clientCredentialType="Whatever your authentication method is" /> 
     <message clientCredentialType="Windows" /> 
     </security> 

Nếu bạn thử, hãy cho tôi biết nếu nó hoạt động!

EDIT:

Ồ, according to the documentation có thể thực hiện xác thực hỗn hợp. Bạn cần phải thiết lập các chế độ để "Mixed", do đó cấu hình có thể giống như thế này:

<security mode="mixed"> 
     <transport clientCredentialType="Whatever your authentication method is" /> 
     <message clientCredentialType="Windows" /> 
     </security> 

Từ các tài liệu:

an ninh hỗn hợp.Bảo mật hỗn hợp mang đến cho bạn tốt nhất cả hai thế giới: bảo mật giao thông đảm bảo tính toàn vẹn và bảo mật của thư, trong khi thông tin đăng nhập và xác nhận quyền sở hữu của người dùng được đóng gói trong mọi thư như trong bảo mật thư. Điều này cho phép bạn sử dụng nhiều thông tin xác thực người dùng khác nhau mà không thể thực hiện được với các cơ chế bảo mật giao thông chặt chẽ và để tận dụng hiệu suất của bảo mật giao thông.

+0

Không có tác dụng. Có lẽ tôi không đặt đúng thông tin đăng nhập cửa sổ và cách truy xuất thông tin từ máy chủ? – croisharp

+0

Bạn có thực sự cần 2 phương pháp xác thực khác nhau không? Bạn có thể chuyển thông tin đăng nhập cửa sổ của ứng dụng khách đến dịch vụ và cho phép dịch vụ [mạo danh người dùng] (http://www.danrigsby.com/blog/index.php/2008/04/17/impersonate-a-clients- identity-in-wcf /). Đây có thể là giải pháp tốt hơn so với cố gắng kết hợp và khớp các loại xác thực. Nếu bạn muốn xác minh tên người dùng, bạn có thể lưu trữ chúng trong cơ sở dữ liệu và so sánh chúng với các chi tiết người dùng của khách hàng giả mạo trong đối tượng được trả về từ 'WindowsIdentity.GetCurrent()' (tốt hơn là lưu trữ sid, vì tên người dùng có thể thay đổi) – Franchesca

+0

Có tôi cần 2 auth. phương pháp + ủy quyền với NetSqlAzMan, nhưng tôi biết tất cả làm thế nào để làm, đây là vấn đề của tôi với xác thực hỗn hợp .. – croisharp

Các vấn đề liên quan