5

Web サイトにログインしてアクションを実行する必要があります。Web サイトは REST ベースなので、これを行うことで簡単にログインできます (ログイン情報は URL のクエリ文字列として含まれているため、資格情報を設定する必要はありません)。

CookieContainer cookieJar = new CookieContainer();

HttpWebRequest firstRequest = (HttpWebRequest) WebRequest.Create(loginUrl);
firstRequest.CookieContainer = cookieJar;
firstRequest.KeepAlive = true;
firstRequest.Method = "POST";
HttpWebResponse firstResponse = (HttpWebResponse)firstRequest.GetResponse();

セッションを維持するために Cookie が返され、上記の cookieJar に保存されます。次に、次のような 2 番目のリクエストを行います。

HttpWebRequest secondRequest = (HttpWebRequest) WebRequest.Create(actionUrl);
secondRequest.Method = "POST";
secondRequest.KeepAlive = true;
secondRequest.CookieContainer = cookieJar;
WebResponse secondResponse = secondRequest.GetResponse();

そして、新しいリクエストに必ず Cookie を割り当てます。しかし、何らかの理由でこれが機能していないようです。「セッションがタイムアウトしたか、有効期限が切れました」というエラーが返されますが、これは次々に行われるため、タイミングの問題ではありません。

私は Fiddler を使用して HTTP ヘッダーを調べましたが、これは HTTPS であるため難しいと感じています。(復号化できることはわかっていますが、うまく機能していないようです。)

この残りのサービスの URL を取り、それらを Firefox に貼り付けると、すべて正常に動作するので、接続の反対側ではなく、間違っているに違いありません。

私は HTTPS にあまり詳しくありません。セッションを維持するために他に何かする必要がありますか? 私はクッキーがそれであると思っていましたが、おそらく 2 つの要求にわたって維持する必要があるものは他にありますか?

最初のリクエストを送信したときに返されるヘッダーは次のとおりです (ただし、無実​​の人を保護するために Cookie を変更しました!)。

X-DB-Content-length=19
Keep-Alive=timeout=15, max=50
Connection=Keep-Alive
Transfer-Encoding=chunked
Content-Type=text/html; charset=WINDOWS-1252
Date=Mon, 16 Nov 2009 15:26:34 GMT
Set-Cookie:MyCookie stuff goes here
Server=Oracle-Application-Server-10g

何か助けていただければ幸いです。アイデアが不足しています。

4

2 に答える 2

4

プログラムからの HTTP トラフィックを復号化した後、ようやく機能するようになりました。

私が取得している Cookie には、Path 変数がリストされていません。したがって、.NET は現在のパスを取得し、それを現在のページを含む Cookie のパスとして割り当てます。つまり、http://mysite/somepath/somepage.htmにある場合、Cookie の path=/somepath/somepage.htm が設定されます。これは、すべての Web ブラウザで行われている "/" に割り当てる必要があるため、バグです。(彼らがこれを修正することを願っています。)

これに気付いた後、Cookie を取得してパス プロパティを変更したところ、すべて正常に動作するようになりました。

このような問題を抱えている人は、Fiddler をチェックしてください。.NET は Windows 証明書ストアを使用するため、プログラムからの http トラフィックを復号化するには、 http ://www.fiddler2.com/Fiddler/help/httpsdecryption.asp の手順に従う必要があります 。また、Fiddler の Options\HTTPS タブで復号化をオンにする必要があります。

于 2009-11-16T17:09:22.983 に答える
0

MSDNから:

ユーザーがセキュリティで保護された領域と公開領域の間を行き来すると、ASP.NET によって生成されたセッション Cookie (または、Cookie のないセッション状態を有効にしている場合は URL) がプレーンテキストで一緒に移動しますが、認証 Cookie は暗号化されていない HTTP 経由で渡されることはありません。Secure cookie プロパティが設定されている限り、接続は許可されません。

基本的に、「Secure」プロパティが「false」に設定されている場合、Cookie は HTTP と HTTPS の両方で渡すことができます。

http と https の間で asp.net セッションを共有する方法も参照してください。

于 2009-11-16T15:19:23.110 に答える