まず第一に、私はすべての同様の投稿を経験しましたが、私の問題を解決するものは何もありません. また、少なくとも Fiddler と Chrome 開発ツールに示されているように、適切な応答ヘッダーを受け取っているため、サーバー側に問題がないことも除外しました。
私はThinktecture.IdentityModelを使用しており、次のように jquery を使用してクライアント側で認証を行いました。
$.ajax({
url: tokenEndpoint,
type: 'GET',
// jsonp is not an option and it does not work anyway with my server setup
dataType: "json", // including this does not help
crossDomain: true, // including this does not help
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Basic xxxxx');
},
success: function () {
alert('success!');
},
error: function(xhr, errorType, exception) {
}
});
これが私が得たトレースです:
* プリフライト CORS リクエスト *
OPTIONS http://HOST_DOMAIN/tokenEndPoint HTTP/1.1
Host: HOST_DOMAIN
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://ORIGIN_DOMAIN
Access-Control-Request-Headers: accept, authorization
Accept: */*
Referer: http://ORIGIN_DOMAIN/login
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
プリフライト応答
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
Access-Control-Allow-Origin: http://ORIGIN_DOMAIN
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: accept,authorization
Content-Length: 15
{"status":"ok"}
実際の AJAX リクエスト
GET http://HOST_DOMAIN/tokenEndPoint HTTP/1.1
Host: HOST_DOMAIN
Connection: keep-alive
Accept: */*
Origin: http://ORIGIN_DOMAIN
Authorization: Basic xxxxx
Referer: http://ORIGIN_DOMAIN/login
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
AJAX レスポンス
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 560
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
Set-Cookie: xxxxx
{
"access_token": "xxxxx",
"expires_in": xxx
}
サーバー呼び出しが成功したことを示す [Fiddler] タブの TextView からのトレースの最後の行に注意してください。サーバー側のコードをデバッグし、その出力を返すコードに到達し、エラーをスローしなかったため、サーバー呼び出しが成功したことを確認できます。それを機能させる方法はありますか?