2014-10-02 23 views
11

Tôi đang cố tạo một dịch vụ web bảo mật.Yêu cầu HTTP bị cấm với lược đồ xác thực ứng dụng khách 'Ẩn danh'. Máy chủ từ xa đã trả về lỗi: (403) Bị cấm

Đây là hợp đồng và dịch vụ thực hiện

[ServiceContract()] 
public interface ICalculatorService 
{ 
    [OperationContract()] 
    int Add(int x, int y); 
} 

[ServiceBehavior(IncludeExceptionDetailInFaults=true)] 
public class CalculatorService : ICalculatorService 
{ 
    public int Add(int x, int y) 
    { 
     return x + y; 
    } 
} 

Ở đây tôi có mã dịch vụ

var b = new WSHttpBinding(SecurityMode.Transport); 
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
b.Security.Message.ClientCredentialType = MessageCredentialType.None; 

Type contractType = typeof(ICalculatorService); 
Type implementedContract = typeof(CalculatorService); 
Uri baseAddress = new Uri("https://localhost:8006/CalculatorService"); 
ServiceHost sh = new ServiceHost(implementedContract); 

sh.AddServiceEndpoint(contractType, b, baseAddress); 

//ServiceMetadataBehavior sm = new ServiceMetadataBehavior(); 
//sm.HttpsGetEnabled = true; 
//sm.HttpsGetUrl = new Uri("https://localhost:8006/CalculatorServiceMex"); 
//sh.Description.Behaviors.Add(sm); 

sh.Credentials.Peer.PeerAuthentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust; 
     sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindBySubjectName, "localhost"); 

sh.Open(); 
Console.WriteLine("Service is Listening"); 
Console.ReadLine(); 
sh.Close(); 

Đây là mã khách hàng

var b = new WSHttpBinding(SecurityMode.Transport); 
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
b.Security.Message.ClientCredentialType = MessageCredentialType.None; 

var factory = new ChannelFactory<ICalculatorService>(b); 
factory.Credentials.Peer.PeerAuthentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust; 
     factory.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindBySubjectName, "localhost"); 

var client = factory.CreateChannel(new EndpointAddress(new Uri("https://localhost:8006/CalculatorService"))); 

ServicePointManager.ServerCertificateValidationCallback = 
    ((sender, certificate, chain, sslPolicyErrors) => 
      { 
       return true; 
      }); 

ICommunicationObject comObject = client as ICommunicationObject; 
int result = -1; 
try 
{ 
    comObject.Open(); 
    result = client.Add(10, 2); 
} 
catch (Exception ex) 
{ 

} 
Console.WriteLine(string.Format("Service say 10 + 2 = {0}", -1)); 
Console.ReadLine(); 

Dịch vụ này chạy tốt và khi ServicePointManager.ServerCertificateValidationCallback kiểm tra được thực hiện không có lỗi chính sách , với chuỗi chứng chỉ chính xác được tạo.

enter image description here

Tôi có CA của tôi trong thư mục gốc đáng tin cậy và các CERT server/client trong cửa hàng TrustedPeople. Ngoài ra nếu tôi điều hướng đến trang web từ trình duyệt, tôi thấy một trang được trả lại. Không có lỗi enter image description here

Tôi đã cập nhật IIS với những gì tôi nghĩ là những yêu cầu, ràng buộc các chứng chỉ trong trong IIS enter image description here

và thông qua dòng lệnh dưới đây. enter image description here

tôi đã thiết lập các cài đặt SSL để chấp nhận chứng chỉ enter image description here

và kích hoạt xác thực nặc danh. enter image description here

Có ai biết những bước nào tôi đã không thực hiện đúng hoặc thấy bất kỳ điều gì không ổn? Tôi tiếp tục gặp lỗi tương tự "Yêu cầu HTTP bị cấm với lược đồ xác thực ứng dụng khách 'Ẩn danh'."

+0

Tôi đã gặp phải ngoại lệ này nhưng đó là do chứng chỉ ssl của tôi hết hạn. –

+0

Có bất kỳ thay thế cho IIS cho WCF. Tôi HATE IIS, một ngày nó hoạt động và tiếp theo nó bắt đầu đưa ra tất cả các loại lỗi mất cả ngày để giải quyết. –

Trả lời

0

Nếu bạn chạy tự tổ chức dịch vụ WCF (không có IIS), bạn có thể kích hoạt khách hàng anonymnous bằng cách thêm vào confing tập tin (trong máy chủ) các folowings:

<behaviors> 
    <serviceBehaviors> 
     <behavior name="limitedAuthBehavior"> 
      <serviceAuthenticationManager authenticationSchemes="Anonymous, Basic, Digest, Negotiate"/> 
      <!-- ... --> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

Ngoài ra, thiết clientCredentialType để "InheritedFromHost":

<bindings> 
     <basicHttpBinding> 
     <binding name="secureBinding"> 
      <security mode="Transport"> 
      <transport clientCredentialType="InheritedFromHost" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
</bindings> 

Tài liệu tham khảo:

Using Multiple Authentication Schemes with WCF

Understanding HTTP Authentication

0

Chúng tôi đã có thông báo lỗi này, và cho chúng ta những giải pháp là Handler Mappings quyền tính năng chưa được kích hoạt cho Script.Bạn có thể bật này trong IIS dưới Handler Mappings> Edit Feature Quyền, hoặc bằng cách thêm Script đến accessPolicy thuộc tính của nút handlers trong web.config của bạn:

<system.webServer> 
    <handlers accessPolicy="Script"> 
    ... 
    </handlers> 
</system.webServer> 
0

Một lý do cho điều này là Giấy chứng nhận bản thân trên máy chủ bạn đang đánh. Đảm bảo bạn đã nhập khóa TƯ NHÂN. Trong MMC, điều này sẽ hiển thị với một "Tên thân thiện". Điều này đã cho tôi ngày để tìm ra. Khi tôi nhập khóa riêng, lỗi ẩn danh sẽ biến mất và tất cả đều tốt!

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