.NET 4にasp.NET WCFがあります。このサービスは、ユーザーの認証に使用されます。ユーザー名とパスワードを送信すると、認証Cookieが含まれたHTTPヘッダーが返されます。ローカルでホストされているテストページを使用すると、これは正しく機能しています。現在、ドメイン間でヘッダー情報にアクセスしようとしています。テストページを別のコンピューターにインストールし、WCFを介して呼び出すように構成しました。呼び出しは機能しており、呼び出しの「データ」応答は正しいです。ただし、次のいずれかでヘッダー情報にアクセスできません。
alert(xmlHttp.getAllResponseHeaders());
または
alert(xmlHttp.getResponseHeader("Set-Cookie"));
IEのデバッガーとFirefoxの「ライブHTTPヘッダー」プラグインを使用すると、ヘッダー情報が返されていることがわかります。
私のグローバルajaxページでは、CORSを処理するように応答を設定しています。
private void EnableCrossDomainAjaxCall()
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
これはAJAXサービスを呼び出すために使用しています:
$("#btnLogin").click(function(e) {
var geturl;
geturl = $.ajax({
// type: "POST",
type: "GET",
contentType: "application/json; charset=utf-8",
url: 'http://10.0.4.66/AuthenticationService.svc/Login?Name=test&password=pwsd',
// url: '../SecurityServer/AuthenticationService.svc/Login?Name=test&password=pwsd',
dataType: "jsonp",
error: function(request, status, error) {
alert('Error Occured');
},
crossdomain: true,
success: function(data, textStatus, xmlHttp) {
// alert(xmlHttp.getResponseHeader("Content-Type"));
document.write(xmlHttp.getResponseHeader("Content-Type") + "<br/>");
alert(xmlHttp.getAllResponseHeaders());
alert(xmlHttp.getResponseHeader("Set-Cookie"));
var headers = '';
var headerPair = xmlHttp.getAllResponseHeaders('wcfCookie').split("\r\n");
var output = '';
$.each(headerPair, function(key, line) {
var parts = line.split(':');
if (parts[0] == 'wcfCookie') {
ChocChip = parts[1]
return false
}
});
}
});
以下は、「ライブHTTPヘッダー」から取得した私のヘッダー情報です
Date: Mon, 04 Feb 2013 12:12:40 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
Access-Control-Allow-Origin: *
Set-Cookie: wcfCookie=8D38D5D6A0F138FEB595DD016F7694EDDF3E6757C82ED3D419F5047A5294974C1885487465CEC0A0BCC2B3802C7B03FF9F5370A05D4CCBDDDABCB1558C3816044BF4F78209BF38C6B1A7CAD34CD3C85C40B8515CFB1C2B2694BC78803D8DACB4
Content-Length: 65
Cache-Control: application/json; charset=utf-8
Content-Type: application/x-javascript
まず、少し背景:
_Access-Control-Allow-Headers
_を使用しており、クライアントがsendに許可されているrequestヘッダーを指定していますが、指定していませんクライアントが許可されているresponseヘッダーread。クライアントが単純でない応答ヘッダーを読み取れるようにするには、_Access-Control-Expose-Headers
_を使用する必要があります。 HTML5 Rocks CORSページ から:
CORSリクエスト中、
getResponseHeader()
メソッドは単純な応答ヘッダーにのみアクセスできます。単純な応答ヘッダーは次のように定義されています。
- キャッシュ制御
- コンテンツ言語
- コンテンツタイプ
- 期限切れ
- 最終更新日
- プラグマ
クライアントが他のヘッダーにアクセスできるようにする場合は、_
Access-Control-Expose-Headers
_ヘッダーを使用する必要があります。このヘッダーの値は、クライアントに公開する応答ヘッダーのコンマ区切りのリストです。
したがって、その新しい情報を考えると、次のようにすることができます。
_HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "Set-Cookie");
_
...しかし、それだけではありません。
さて、実際の答え:
ここにもう1つの深刻な問題があります:XHR仕様 明示的に_Set-Cookie
_ の読み取りを禁止します。これは、機能的にはクロスドメインCookieを盗む攻撃だからです。
ドメインAがドメインBに対してクロスドメインリクエストを行うとします。ドメインBがCookieを設定するとき、ドメインBのみにドメイン固有のCookieを設定します。ドメインAがドメインBのCookieを読み取ろうとすると、Cookieアクセスに関する同一起源のポリシーに違反します。
WCFがわからないので、実際に実際にを実行する最良の方法はわかりませんが、解決策は認証トークンを渡すことだと思いますドメインAが独自のCookieを読み取って設定するCookie(たとえば、_X-WCF-Auth
_ヘッダー?)を介さない。
以下を設定していないため、ブラウザのセキュリティポリシーが応答をブロックする可能性があります。
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials","true");
それでも解決しない場合は、追加してみてください
xhrFields: { withCredentials: true }
ajax
オプションを追加することもお勧めします。