2009-09-17 26 views
13

Câu hỏi của tôi xoay quanh Dịch vụ REST WCF cho IIS đáp ứng với JSONP. Tôi lấy các lớp học trong giải pháp này: http://msdn.microsoft.com/en-us/library/cc716898.aspx và thêm chúng vào của tôi. Mọi thứ đã hoạt động tốt trên máy trạm của nhà phát triển của tôi bằng cách sử dụng mạo danh với httpTransport nhưng khi tôi cố gắng chuyển sang máy chủ phát triển, tôi đã gặp phải một số vấn đề bảo mật. Những vấn đề này đã được giải quyết bằng cách sử dụng cấu hình bên dưới và người dùng nhận dạng App Pool. Tôi cũng cấu hình IIS metabase tập tin cho NTLM chỉ xác thực (chúng tôi đang sử dụng IIS 6 nhưng sẽ là IIS 7 sớm, cần phải làm việc trên cả hai) như tôi không có quyền truy cập để thực hiện một SPN. Tôi tin rằng cấu hình hiện tại đã giải quyết được sự cố bảo mật của tôi nhưng trong quá trình phản hồi JSONP của tôi đã bị hạ cấp xuống regualar JSON, đây là vấn đề. Dưới đây là cấu hình có liên quan:Ràng buộc JSONP tùy chỉnh WCF và httpsTransport

<services> 
     <service name="IS.Core.Infrastructure.RESTRouter.Transactions" behaviorConfiguration=""> 
      <endpoint address="" behaviorConfiguration="webHttp" binding="customBinding" 
       bindingConfiguration="jsonpBinding" contract="IS.Core.Infrastructure.RESTRouter.ITransactions"> 
      </endpoint> 
     </service> 

     <service name="IS.Core.Infrastructure.RESTRouter.Queue" behaviorConfiguration=""> 
      <endpoint address="" behaviorConfiguration="webHttp" binding="customBinding" 
       bindingConfiguration="jsonpBinding" contract="IS.Core.Infrastructure.RESTRouter.IQueue" /> 
     </service> 
    </services> 

    <behaviors> 
     <endpointBehaviors> 
      <behavior name="webHttp"> 
       <webHttp /> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 

    <bindings> 
     <customBinding> 
      <binding name="jsonpBinding"> 
       <jsonpMessageEncoding /> 
       <httpsTransport 
         manualAddressing="true" 
         authenticationScheme="Ntlm" /> 
      </binding> 
     </customBinding> 
    </bindings> 

    <extensions> 
     <bindingElementExtensions> 
      <add name="jsonpMessageEncoding" 
       type="IS.Core.Infrastructure.RESTRouter.JsonpBindingExtension, RESTRouter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bindingElementExtensions> 
    </extensions> 

đây là một trong những định nghĩa phương thức giao diện:

[OperationContract] 
    [WebGet(UriTemplate = "{ModelPath}/{ObjectTypeName}?callback={callback}", ResponseFormat = WebMessageFormat.Json)] 
    [JSONPBehavior(callback = "callback")] 
    JSONPXml NewObject(string ModelPath, string ObjectTypeName, string callback); 

đây được thực hiện:

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)] 
    public JSONPXml NewObject(string ModelPath, string ObjectTypeName, string callback) { 

     int val = getEmployeeIdByNTUsername(OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name); 

     JSONPXml jsp = null; 
     EntityPluginReflectorClient client = null; 
     try { 
      client = new EntityPluginReflectorClient(); 
      string output = client.NewObject(ModelPath, ObjectTypeName); 
      jsp = new JSONPXml() { xml = output }; 
     } catch (Exception e) { 
      InfrastructureLog.WriteException(this, "NewObject", e); 
      jsp = getExceptionResponse(e); 
     } 
     finally { 
      client.Close(); 
     } 
     return (jsp); 
    } 

và đây là hợp đồng dữ liệu:

[DataContract()] 
public class JSONPXml { 
    public JSONPXml() { } 
    [DataMember] 
    public string xml; 
} 

Vui lòng cho tôi biết nếu cần thêm thông tin và cảm ơn vì đã xem xét điều này.

Trả lời

0

Điều này có vẻ giống như hiển nhiên, nhưng bạn đã kiểm tra xem bạn vẫn đang chuyển thông số truy vấn "gọi lại" trong máy chủ phát triển của bạn chưa?

Nhìn vào nguồn JSONPEncoder có vẻ như nó vẫn sẽ viết một thông điệp JSON cho phản hồi, ngay cả khi thông số "gọi lại" chưa được nhận. Nó sẽ không định dạng trình bao bọc phương thức JavaScript.

+0

Cảm ơn, sau bình luận của bạn, tôi đã kiểm tra kỹ và tham số truy vấn gọi lại hiện diện trong cả hai môi trường. Một điều cần lưu ý là trên hệ thống cục bộ của tôi khi tôi thay đổi cấu hình từ httpTransport thành HttpsTransport, đầu ra trở thành json thông thường. –

+0

Lạ. Bạn nói bạn đã bao gồm các lớp từ mẫu. Nếu bạn đặt một điểm ngắt trong cả hai phương thức WriteMessage của JSONPEncoderFactory thì có bất kỳ lỗi nào trong số chúng xảy ra khi bạn thực hiện cuộc gọi không? –

1

Tôi không chắc chắn 100% của câu trả lời, nhưng đây là một vài điều có thể giúp bạn thu hẹp nó xuống:

Đối với người mới bắt đầu, nếu bạn đặt ProtectionLevel một cách rõ ràng hoặc là Đăng hoặc EncryptAndSign, sau đó bạn phải sử dụng một ràng buộc với an ninh được kích hoạt hoặc một ngoại lệ sẽ được ném. Điều đó sẽ bắt đầu ném ngoại lệ nếu bạn thử truy cập nó thông qua http, điều này có thể giúp bạn tìm ra cách bạn đang thực sự truy cập dịch vụ.

Thứ hai, vì bạn đang sử dụng tùy chỉnh liên kết, bạn sẽ cần phải cho biết loại bảo mật bạn muốn trong liên kết. Tôi không nghĩ là đủ để chỉ định httpsTransport. Cách bạn làm điều đó là thông qua các security tag. Từ âm thanh của nó, bạn sẽ cần phải thiết lập authenticationMode="SspiNegotiated".

Theo the custom binding docs

Thứ tự mà các yếu tố xuất hiện trong các vấn đề chồng, bởi vì nó là thứ tự trong đó hoạt động được áp dụng vào tin nhắn.Trình tự đề nghị của các yếu tố ngăn xếp như sau:

giao dịch (không bắt buộc)

Tin nhắn đáng tin cậy (không bắt buộc)

an ninh (không bắt buộc)

Giao thông vận tải

Encoder (không bắt buộc)

Thông tin thêm về Cu stom Binding Security herehere Hy vọng điều đó sẽ hữu ích.

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