2011-08-29 20 views
19

Windowsサービス内でホストされているWCF RESTサービスがあり、すべての応答にAccess Control-Allow-Origin HTTPヘッダー(CORSの一部として定義)を送信したいと考えています。WCF RESTサービス内のCORSサポート

マイ未遂ソリューションはIDispatchMessageInspector実装内で、次のようなものを持っていることでした。

public void BeforeSendReply(ref Message reply, object correlationState) 
{ 
    var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty; 
    if (httpResponse != null) 
    { 
     // test of CORS 
     httpResponse.Headers["Access-Control-Allow-Origin"] = "*"; 
    } 
} 

通常、これは動作しますが、残念ながら私のサービスは、要求が許可なしで来るときことを意味し、HTTP basic authorizationを使用していますWCFは資格情報を要求する401応答を自動的に送信します。残念ながら、この最初の交換ではWCFはIDispatchMessageInspectorを呼び出さないため、Access-Control-Allow-Originヘッダーは最初の交換に追加されません。

この問題は、ブラウザからサービスを呼び出そうとしたときに発生します。 CORSでは、発信元ドメインがAccess-Control-Allow-Origin応答ヘッダー(*がすべてのドメインに一致)にリストされているドメインと一致する場合にのみ、クロスオリジン要求を許可するように指定しています。残念なことに、ブラウザがAccess-Control-Allow-Originヘッダーのない最初の401応答を見ると、アクセスが妨げられます(same origin policyによる)。

WCFによって自動的に送信される最初の401応答にヘッダーを追加する方法はありますか?

+0

これでどこにいらっしゃいましたか? –

答えて

6

HttpModuleをimpelementing +登録することで可能な認証を自分で処理する必要があることを実現するには、そこに401を発行し、必要に応じてhttpヘッダを発行します。ここでのSOのサンプル実装 - OPからのコメントの後 - Adding basic HTTP auth to a WCF REST service

EDIT参照:OPさんのコメントが、彼は解決策がIDispatchMessageInspector.BeforeSendReplyとし、IDispatchMessageInspector.AfterReceiveRequestで実際にHTTPModuleではありませんが、セルフホスティングであることを述べているので

を。

承認は「なし」に設定し、カスタムはIDispatchMessageInspectorで実装/処理する必要があります。この方法で、401を発行する際に任意のヘッダーを追加できます。そうしないと、Basic Authを処理するランタイムは、正しい/正のAuthの前にIDispatchMessageInspectorにコールしません。このものの

+0

返事をありがとう。私のサービスは、ホストされていないWindowsサービスでなければなりません。私のサービスにおけるHTTPの基本認証はすごく効果的です。 CORSも正常に動作します(基本認証を無効にすると仮定します)。この問題は、HTTP BasicとCORSを自己ホスト型サービスに混在させる場合にのみ発生します。 IISでサービスをホストする場合は、すべての要求に対してCORS応答ヘッダーを送信し、HTTP基本認証にHttpModuleを使用するようにIISを構成します。 – Kevin

+0

ok - 私の編集を参照してください...あなたのソリューションはすでに半分でした...もう1つの方法を実装し、設定を変更する必要があります... – Yahia

+0

clientCredentialType = "None"を設定し、 401返信を送信できますが、WCFではWWW-Authenticate応答ヘッダーを設定できません。コード内にWWW-Authenticateを設定しようとすると、WCFは504を返します.WWW-Authenticateを使用しない場合、ブラウザは資格情報の入力を求めません。 – Kevin

22

この男は私の一日を救った...これは、あなたがその適切な実施を確保するためにappriopriate対策を取る必要があるため、セキュリティ・小文字の区別もコードを自分で実装し、意味ことに注意してください動作します。

http://blogs.microsoft.co.il/blogs/idof/archive/2011/07.aspx

私は、Webページがいつか死ぬことを念のために、ここで彼のノートの一部を配置するつもりです。

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webSupport"> 
     <webHttp /> 
     <CorsSupport /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<extensions> 
    <behaviorExtensions> 
    <add name="CorsSupport" type="WebHttpCors.CorsSupportBehaviorElement, WebHttpCors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 
<services> 
    <service name="Service.JSonService"> 
    <endpoint address="http://localhost:8080" behaviorConfiguration="webSupport” binding="webHttpBinding" contract="Service.IJSonService" /> 
    </service> 
</services> 

今(私はリンク「あなたの答えはここで」、そして、リンクが死んで発見。嫌い)、あなたは「WebHttpCors.dll」と呼ばれる彼のダウンロード可能なライブラリを見つける必要があります。

しかし、そこにはGoogleの解決にあなたの道を導くのに役立つ(上記)があります。

ループのために(私のシナリオで)私を投げていた部分は、IEが動作していたのですが、Firefoxは動作していませんでした。

私の元のページは:

http://localhost:53692/test/WCFCallTestViaJQ14.htm 

だから私のサービスはである:だから私は< < localhostにしていた

http://localhost:8002/MyWCFService/MyWCFMethodByWebGet?state=NC&city=Raleigh 

- >> localhostのトラフィックを。

****しかし、ポートは異なっていました。 (53692と8002)****

IEは問題ありませんでした。 Firefoxはそれで大丈夫ではなかった。

次に、各ブラウザが.Send()要求を別々に処理することを覚えておいてください(JQUERYの中にあります)。

今はすべて意味があります。

//JavaScript snipplet 

if (window.XMLHttpRequest) { 

    returnObject = new XMLHttpRequest(); 

} else if (window.ActiveXObject) { 

    returnObject = new ActiveXObject("Microsoft.XMLHTTP"); 

} else { 

msg = "Your browser doesn't support AJAX!"; 

} 

ここにいくつかのキーワードがありますが、私がグーグルでやっているフレーズは、最終的に私をどこかに導きました。

Result: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.statusText]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://localhost:53692/test/WCFCallTestViaJQ14.htm :: HandleJQueryError :: line 326" data: no] 


XMLHttpRequest Send "NS_ERROR_FAILURE" 

JQuery Ajax WCF Self Hosted CORS JSON 
+0

Upvoteからすべての詳細について直接アクセスすると、私のサービスは信任状を宣言しません。リンクの腐敗に対して良い戦いを続けてください! – codekaizen

関連する問題