2

私が読んだことから、ドメイン間でCookieを送信することは不可能です(ブラウザがプライバシー上の理由でそれらをブロックしていることを理解しているため)。ただし、誰かが回避策について教えてくれることを願っています。

.Net winFormsクライアントでこれを達成しましたが、Webソフトウェアで動作させることができません。

シナリオ:私のWebサイトがあります。これは、顧客のファイアウォールの内側に存在し、オフィスの外部からアクセスできないXMLを使用したREST実装を使用するサードパーティシステムを呼び出す必要があります(VPNもオプションではありません)。

私は自分のクッキーを設定しました:

$.cookie('name', 'value', {path : '/', domain : '192.168.254.164'});

投稿リクエストを行う

$.post(call, function(d) {}, 'text')
.success(function(d) {... /*do something*/

ただし、Cookieは送信されません(以下の要求ヘッダーと応答ヘッダーを参照してください)

Request Headers
Accept    text/plain, */*; q=0.01
Accept-Encoding   gzip, deflate
Accept-Language   en-gb,en;q=0.5
Connection    keep-alive
Host  192.168.254.164:8080
Origin    http://localhost:27249
Referer   http://localhost:27249/index.html
User-Agent    Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0


Response Headers
Access-Control-Allow-Orig...  http://localhost:27249
Cache-Control no-cache
Content-Type  application/xml;charset=UTF-8
Date  Tue, 01 May 2012 15:14:58 GMT
Server    Sun Java System Application Server 9.1_01
Set-Cookie    JSESSIONID=8f7fbcd40348c0b5d912830bca8a; Path=/App
Transfer-Encoding chunked
X-Powered-By  Servlet/2.5

私が受け取った応答は、私が無許可であることを示しています(これはCookieが設定されていないためです)。

サードパーティのサーバーでは何も変更できないため、プロキシではすべてがXMLであるため、JSONPを使用できません。

デバッグのために、送信する前にCookieを読み取ろうとしましたが、結果は「null」になります。

alert($.cookie(_svcMnuCookieSessionIdKey));

私はWeb開発に慣れていないので、これは奇妙な質問かもしれませんが、応答ヘッダーからわかるように、ブラウザーがCookieを処理するため、Cookieを受信して​​いると思います(ログインすると同じCookieを受信します)。 、それを保存して私のリクエストに自動的に適用するべきではありませんか?上記のように手動で追加するのではなく?とはいえ、JSESSIONIDは両方のリクエストで異なる値を持っているように見え、仕様では、Cookieの値としてログインしたときに取得した元のJSESSIONIDを使用する必要があると規定されています。

私の.Netアプリでは、次のようにしています。

 Dim httpWebRequest As Net.HttpWebRequest = CType(Net.WebRequest.Create("http://192.168.254.164:8080/App/RestfulService"), Net.HttpWebRequest)

 httpWebRequest.UserAgent = My.Application.Info.AssemblyName
 httpWebRequest.KeepAlive = True 'set the connection keep-alive (this is the default)
 httpWebRequest.Headers.Set(Net.HttpRequestHeader.Pragma, "no-cache") 'we don't want caching to take place so we need to set the pragma header to say we don't want caching
 httpWebRequest.Method = "POST"

 If Not String.IsNullOrEmpty(_sessionId) Then 'it isn't used on some request, so don't add it if it is nothing
     Dim cookie As New System.Net.Cookie("JSESSIONID", _sessionId)
     cookie.Domain = New Uri("http://192.168.254.164:8080/App/RestfulService").Host
     httpWebRequest.CookieContainer = New Net.CookieContainer
     httpWebRequest.CookieContainer.Add(cookie)
 End If

 httpWebRequest.ContentType = "application/x-www-form-urlencoded"

 Dim postData As Byte() = New System.Text.UTF8Encoding(False).GetBytes(RichTextBox1.Text)

 httpWebRequest.ContentLength = postData.Length

 Using tmpStream As IO.Stream = httpWebRequest.GetRequestStream
     tmpStream.Write(postData, 0, postData.Length)
 End Using

 Dim httpWebResponse As Net.HttpWebResponse = CType(httpWebRequest.GetResponse, Net.HttpWebResponse)

 If WebValidation.WebResponseHasContent(httpWebResponse) Then

     Dim str As String = String.Empty
     'Read the raw HTML from the request
     Using sr As New IO.StreamReader(httpWebResponse.GetResponseStream, System.Text.Encoding.UTF8)
         str = sr.ReadToEnd
     End Using

 End If

Return str

それで、これはクロスドメインのクッキーリクエストですか?Webクライアントでこの機能を再作成するにはどうすればよいですか?

4

2 に答える 2

1

クロス ドメイン Cookie を設定しようとしているとは思いません。システムはあなたにそれを求めません。通常、このような状況では、サードパーティのシステムとハンドシェイクを行ってトークンを取得するか、この場合は最初に (システムから) JSESSIONID を取得する必要があります。ただし、システムから Cookie を受け入れるのではなく、サードパーティのシステムに Cookie を設定しようとしているように見えます。それは理にかなっていますか?したがって、私が期待しているのは、サードパーティのシステムにリクエストを送信してトークンを取得し、xml を取得しようとするときに後続のすべてのリクエストに対してそのトークンを返す必要があることです。

あなたのシナリオでは、Web アプリとサードパーティ アプリがあると思います。混乱を招く可能性があるのは、ブラウザに設定されている Cookie と Web アプリに「設定」されている Cookie (認証目的) です。

サードパーティ システムで認証され、JSESSIONID が返されたら、後続のリクエスト ヘッダーに、JSESSIONID を含む「Cookie」ヘッダーまたはサードパーティ システムが認証に必要とするものを含むように設定してみてください。

この場合、Web アプリからサービスとしてサード パーティを呼び出す場合、サード パーティへの呼び出しの「ブラウザー」は Web アプリであることに注意してください。そのため、サード パーティ システムへの後続の呼び出しを行うときは、Cookie (認証セッション ID を含む) が存在するふりをしてブラウザーを模倣する必要があります。これは、「Cookie」要求ヘッダーを設定することによって行います。

于 2012-05-01T16:10:01.167 に答える
-2

できません。ブラウザー メーカーは、あなたが達成しようとしていることが起こらないようにするために多くの時間と労力を費やしてきました。一時的な解決策を見つけたとしても、それはセキュリティ ホールと見なされ、おそらく次のリリースでパッチが適用されます。

代わりに、必要な情報を Web サービスに渡す方法を考えてみてください。

于 2012-05-01T15:50:20.583 に答える