2009-09-17 18 views
13

私の質問は、JSONPで応答するIIS用のWCF RESTサービスを中心にしています。私はこの解決策のクラスを取った:http://msdn.microsoft.com/en-us/library/cc716898.aspxそして私のものにそれらを加えた。 httpTransportで偽装を使用して開発者ワークステーションで問題なく動作していましたが、開発サーバーに移動しようとしたときにセキュリティ上の問題が発生しました。これらの問題は、以下の設定とApp Pool IDユーザーを使用して解決されました。また、SPNを作成するためのアクセス権がないため、NTLMのみの認証用にIISメタベースファイルを構成しています(IIS 6を使用していますが、すぐにIIS 7になります。私は現在の設定が私のセキュリティ問題を解決したと考えていますが、私のJSONPレスポンスはregualar JSONにダウングレードされましたが、これは問題です。ここでは、関連する設定されていますWCFカスタムJSONPバインディングと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> 

ここでは、インターフェイスメソッド定義の1つである:ここで

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

はその実装です:

[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); 
    } 

、ここでは、データコントラクトです:

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

詳しい情報が必要な場合はお知らせください。ありがとうございました。

答えて

0

これは明らかなようですが、開発サーバーで「コールバック」クエリのパラメータを渡していることを確認しましたか?

JSONPEncoderソースを見ると、「コールバック」パラメータが受信されていなくても、レスポンスにJSONメッセージが書き込まれているようです。 JavaScriptメソッドラッパーをフォーマットするだけではありません。

+0

ありがとう、あなたのコメントの後に私は二重チェックを行い、コールバッククエリのparamは両方の環境に存在します。私のローカルシステムでは、configをhttpTransportからHttpsTransportに変更すると、出力は通常のjsonになります。 –

+0

奇妙な。あなたは、サンプルのクラスを含めたと言いました。 JSONPEncoderFactoryの両方のWriteMessageメソッドにブレークポイントを設定すると、呼び出し時にヒットしたものがありますか? –

1

私は答えの100%わからないんだけど、ここにあなたがそれを絞り込むのに役立ついくつかのものです:

手始めに、あなたはどちらかログインまたはEncryptAndSignに明示的ProtectionLevelを設定した場合、その後、あなたがしなければなりませんセキュリティを有効にしたバインディングを使用するか、例外がスローされます。それはあなたが実際にサービスにアクセスしているかを理解するのに役立つ、http経由でアクセスしようとすると例外をスローし始めます。

第2に、customBindingを使用しているため、バインドに必要なセキュリティの種類を指定する必要があります。私はそれがちょうどhttpsTransportを指定するのに十分だとは思わない。あなたのやり方はsecurity tagです。その音から、authenticationMode="SspiNegotiated"を設定する必要があります。

それは操作がメッセージに を適用した 順序であるので要素は、 スタック事項に表示される順序the custom binding docs

によります。スタック要素の推奨順序 は次のとおりです:(オプション)

取引

高信頼性メッセージング(オプション)(オプション)

セキュリティ

交通

エンコーダ(オプション)

Cuに関するさらに詳しい情報stomバインディングセキュリティherehere うまくいけば助けてください。

関連する問題