2011-11-22 35 views
18

Có một số sự cố khi sử dụng xác thực cơ bản với dịch vụ Wcf thử nghiệm đơn giản. Tôi nhận được ngoại lệ:Wcf Xác thực cơ bản

Dịch vụ được yêu cầu, 'http: //qld-tgower/test/Service.svc' không thể kích hoạt được. Xem nhật ký theo dõi chẩn đoán của máy chủ để biết thêm thông tin.

Và trong trace log nó cho thấy:

Các lược đồ xác thực cấu hình trên máy chủ ('cơ bản') không cho phép những cấu hình trên các ràng buộc 'BasicHttpBinding' ('Anonymous'). Hãy đảm bảo rằng SecurityMode được đặt thành Transport hoặc TransportCredentialOnly. Ngoài ra, điều này có thể được giải quyết bằng cách thay đổi lược đồ xác thực cho ứng dụng này thông qua công cụ quản lý IIS, thông qua thuộc tính ServiceHost.Authentication.AuthenticationSchemes, trong tệp cấu hình ứng dụng tại phần tử <serviceAuthenticationManager>, bằng cách cập nhật thuộc tính ClientCredentialType trên ràng buộc, hoặc bằng cách điều chỉnh thuộc tính AuthenticationScheme trên HttpTransportBindingElement.

Nhưng những gì tôi không hiểu khi tôi sử dụng tên người dùng và mật khẩu không chính xác, nó cho biết IS sử dụng xác thực cơ bản?

Yêu cầu HTTP không được ủy quyền với lược đồ xác thực ứng dụng khách 'Cơ bản'. Tiêu đề xác thực nhận được từ máy chủ là 'Basic realm = "qld-tgower"'.

Đây là chi tiết web.config của tôi

<system.serviceModel> 
<services> 
    <service name="WcfService" 
     behaviorConfiguration="Behavior"> 
    <endpoint address="http://QLD-TGOWER/test/Service.svc" 
       binding="basicHttpBinding" 
       bindingConfiguration="httpBinding" 
       contract="IService" /> 
    </service> 
</services> 
<diagnostics> 
    <endToEndTracing activityTracing="false" messageFlowTracing="true" propagateActivity="true"></endToEndTracing> 
</diagnostics> 
<bindings> 
    <basicHttpBinding> 
    <binding name="httpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic" proxyCredentialType="Basic"> 
     </transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true"/> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
</system.serviceModel> 

và đây là App.config tôi

<system.serviceModel> 
    <diagnostics> 
     <endToEndTracing activityTracing="true" /> 
     <messageLogging logMessagesAtTransportLevel="true" /> 
    </diagnostics> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IService" > 
      <security mode="TransportCredentialOnly"> 

      <transport clientCredentialType="Basic" proxyCredentialType="Basic"></transport> 
      <message clientCredentialType="UserName" /> 
      </security> 

     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://QLD-TGOWER/test/Service.svc" binding="basicHttpBinding" 
     bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService" 
     name="BasicHttpBinding_IService" /> 
    </client> 
</system.serviceModel> 

ứng dụng thử nghiệm của tôi

private static void Main(string[] args) 
{ 
    var proxy = new ServiceClient("BasicHttpBinding_IService"); 
    var clientCredentials = proxy.ClientCredentials; 
    clientCredentials.UserName.UserName = "username"; 
    clientCredentials.UserName.Password = "password"; 
    var res = proxy.GetData(1); 
    Console.WriteLine(res); 
    Console.WriteLine("Done"); 
    Console.ReadKey(true); 
} 

Và dịch vụ của tôi

public class Service : IService 
{ 

    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

Có một cái gì đó mà tôi đang thiếu ở đây?

Trả lời

17

Thay đổi tên và hợp đồng dịch vụ để bao gồm không gian tên.

Ngoài ra, hãy xóa địa chỉ điểm cuối (đặt nó thành "") và không bao gồm proxyCredentialType trong thẻ vận chuyển.

End kết quả của web.config nên giống như thế này

<system.serviceModel> 

    <services> 
     <service name="MyNameSpace.MyService" behaviorConfiguration="asdf"> 
     <endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="httpBinding" contract="MyNameSpace.IMyService" /> 
     </service> 
    </services> 

    <diagnostics> 
     <endToEndTracing activityTracing="true" messageFlowTracing="true" 
      propagateActivity="true"> 
     </endToEndTracing> 
    </diagnostics> 

    <bindings> 
     <basicHttpBinding> 
     <binding name="httpBinding"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="asdf"> 
      <!-- To avoid disclosing metadata information, set the value below to 
       false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true" /> 
      <!-- To receive exception details in faults for debugging purposes, 
       set the value below to true. Set to false before deployment to avoid 
       disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 

     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/> 

    </system.serviceModel> 
2

Hãy thử cho cả client và server configs

<basicHttpBinding> 
    <binding name="BasicHttpBinding_IService"> 
     <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" /> 
     </security> 
    </binding> 
</basicHttpBinding> 

Cài đặt/Bật xác thực cơ bản

Bạn cũng có thể cần phải cài đặt và áp dụng xác thực cơ bản trong IIS.

Goto "Chương trình và tính năng"/"Bật/tắt tính năng cửa sổ". Bật "xác thực cơ bản" ở đâu đó trong IIS và bảo mật.

Tôi đã đóng và mở bàn điều khiển IIS và có thể bật nó trong cài đặt xác thực.

Điều này tất nhiên nếu thử nghiệm phát triển và cảnh báo bạn về việc không có chứng chỉ SSL.

+0

Cảm ơn, Điều đó đã sửa lỗi xác thực, nhưng bây giờ dịch vụ chỉ đi vào trạng thái bị lỗi. Không có gì trong nhật ký theo dõi để cho biết lý do. – TheRealTy

1

Bạn đang không được phép sử dụng xác thực username qua kết nối không an

Bạn có thể đảm bảo thông điệp bằng cách sử dụng một phương tiện giao thông an toàn (ví dụ SSL) hoặc mã hóa tin nhắn (sử dụng giấy chứng nhận)

Tôi đã sử dụng ClearUsernameBinding trong quá khứ để thành công lớn, nhưng tôi không khuyên bạn nên nó trong sản xuất. Tôi đã sử dụng nó để tôi có thể giữ tất cả mã xác thực của mình giống nhau mà không yêu cầu SSL trong môi trường thử nghiệm/dev, nhưng có nó hoạt động với SSL bằng cách thay đổi cấu hình chỉ.

Lưu ý: liên kết tùy chỉnh đó không hoàn hảo và tôi phải thay đổi một chút để bật các thay đổi cấu hình nhất định.

0

Đây là những gì đã giải quyết được vấn đề đối với tôi:

<bindings> 
    <basicHttpBinding> 
    <binding> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Để tham khảo see: https://msdn.microsoft.com/en-gb/library/ff648505.aspx

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