ASP.NET:リクエスト間でのSession.SessionIDの変更


142

なぜ不動産んセッションIDセッションは、要求間のASP.NETページの変更に-object?

私はこのようなページを持っています:

...
<div>
    SessionID: <%= SessionID %>
</div>
...

また、ブラウザーに関係なく、F5を押すたびに出力が変化し続けます。

回答:


225

という訳だ

Cookieベースのセッション状態を使用する場合、ASP.NETは、Sessionオブジェクトが使用されるまで、セッションデータ用のストレージを割り当てません。その結果、セッションオブジェクトがアクセスされるまで、ページ要求ごとに新しいセッションIDが生成されます。アプリケーションでセッション全体に静的セッションIDが必要な場合は、アプリケーションのGlobal.asaxファイルにSession_Startメソッドを実装し、データをSessionオブジェクトに格納してセッションIDを修正するか、またはコードの別の部分でコードを使用できます。 Sessionオブジェクトにデータを明示的に格納するアプリケーション。

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx

したがって、基本的には、バックエンドでセッションオブジェクトにアクセスしない限り、リクエストごとに新しいsessionIdが生成されます

編集

このコードは、Global.asaxファイルに追加する必要があります。エントリがSessionオブジェクトに追加されるため、セッションが期限切れになるまで修正できます。

protected void Session_Start(Object sender, EventArgs e) 
{
    Session["init"] = 0;
}

23
私はそれで問題がなかった、ということを知りませんでしたが、それは知っているのは興味深いです
Pharabus

1
@Cladudioは1行のコードを投入するだけで、答えは完璧です。興味深い質問から出てくる興味深い情報...プラス1つ?;)
Seb Nilsson、

2
興味深いことに、これで私の問題は修正されますが、問題はコードベースを問題なく使用して約6か月後に初めて現れました。これが突然変更された理由は考えられません-以前になかったときにセッションIDが突然リセットされる理由を誰かが提案できますか?
Moo

2
@KumarHarsh:セッションでオブジェクトを保存すると、セッションIDが修正されます。それは私が「バックエンドのセッションオブジェクトにアクセスしない限り...」と言うつもりです。someidセッションを割り当てると、同じままになります。この回答は4年以上前のものであることを考慮に入れてください。これに関して変更があったかどうかはわかりません。
Claudio Redi 2014年

9
私のGlobal.asaxにSession_StartメソッドWITH NOTHING IN ITを追加するだけでこの作業ができることに気付きました。ヒントをありがとう@Claudio。
Pedro

92

Cladudioによって示されているようにSessionオブジェクトが初期化されている場合でも、これが発生する可能性のある別の、より陰湿な理由があります。

Web.configで、<httpCookies>設定されているrequireSSL="true"が実際にはHTTPSを使用していないエントリがある場合、特定のリクエストに対して、セッションCookieは送信されません(または返されない可能性があります。リクエストごとに新しいセッションが発生することになります。

私はこれを困難な方法で見つけ、ソースコントロールのいくつかのコミット間を行ったり来たりして、特定の変更によってアプリケーションが壊れていることがわかるまで、数時間を費やしていました。


5
私はこれを知っていたが、まだ3ヶ月ごとに、それを忘れたり、そうとデバッグ時間を過ごす...
sotn

私の場合、localhostでテストしており、web.configの「requireSSL」が「true」に設定されていました。ありがとう。
William Pereira

これは私のケースであり、私はそれを理解しようと非常に多くの時間を費やしました(さまざまなweb.configファイルに赤いニシンがいた)。
jmoreno 2017

上記の提案は2018年にも役立っています。これは最も頻繁なシナリオです。ありがとう!
Vijay Bansal

5

私の場合、セッションCookie にプレフィックスを含むドメインが含まれていることがわかりました。URLに 追加するとすぐに問題が修正されました。後でCookieのドメインをの代わりに設定するように変更しました。www.www.
www..mysite.comwww.mysite.com


5

私の問題は、これをweb.configに設定したことです

<httpCookies httpOnlyCookies="true" requireSSL="true" />

これは、非SSL(デフォルト)でデバッグする場合、認証Cookieがサーバーに返されないことを意味します。これは、サーバーがすべてのリクエストに対して新しい認証Cookieを(新しいセッションで)クライアントに送信することを意味します。

修正は、web.configでrequiresslをfalseに、web.release.configでtrueに設定するか、デバッグ中にSSLをオンにすることです。

SSLをオンにする


これは、2011年のネヴィルクックの回答とどう違うのですか?
Ian Kemp

4

Nevilleの回答を使用して(web.configでrequireSSL = trueを削除) Joel Ethertonのコードわずかに変更します。これは、ユーザーとページに応じて、SSLモードと非SSLモードの両方で実行されるサイトを処理するコードです(Iコードに戻り、SSLでまだテストしていませんが、動作することを期待しています-後でビジー状態になり、これに戻ることができないため、ここに示します。

if (HttpContext.Current.Response.Cookies.Count > 0)
        {
            foreach (string s in HttpContext.Current.Response.Cookies.AllKeys)
            {
                if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
                {
                    HttpContext.Current.Response.Cookies[s].Secure = HttpContext.Current.Request.IsSecureConnection;
                }
            }
        }

2

Session_OnStartが定義されている場合やセッションが初期化されている場合でも、SessionIDがリクエスト間で変化するもう1つの可能性は、URLホスト名に無効な文字(アンダースコアなど)が含まれていることです。これはIE固有である(検証されていない)と思いますが、URLがの場合、http://server_name/appIEはすべてのCookieをブロックし、リクエスト間でセッション情報にアクセスできなくなります。

実際、各リクエストはサーバー上で個別のセッションを起動するため、ページに複数の画像、スクリプトタグなどが含まれている場合、それらのGETリクエストのそれぞれがサーバー上で異なるセッションになります。

詳細情報:http : //support.microsoft.com/kb/316112


2

私の場合、これは私の開発環境とテスト環境で多く発生していました。上記の解決策をすべて試した後、すべてのセッションCookieを削除することでこの問題を解決できることがわかりました。Web開発者向け拡張機能を使用すると、これを非常に簡単に実行できます。私は主にテストと開発にFirefoxを使用していますが、これはChromeでのテスト中にも起こりました。この修正はChromeでも機能しました。

私はまだ本番環境でこれを行う必要がなく、ログインできないという報告を受けていません。これも、セッションCookieを安全にした後でのみ発生したようです。彼らが安全でないとき、それは過去に決して起こりませんでした。


更新:これは、安全にするためにセッションCookieを変更した後にのみ発生し始めました。正確な問題は、同じパスとドメインのブラウザに2つ以上のセッションCookieが存在することが原因であると判断しました。常に問題だったのは、空またはnull値を持つ問題でした。その特定のクッキーを削除した後、問題は解決されました。また、Global.asax.csのSessin_Startメソッドにコードを追加して、この空のCookieをチェックし、有効な場合は有効期限を過去の日付に設定しました。
Matt L

2

私の場合は、外部アプリケーションのゲートウェイからリダイレクトした後にセッションを変更していたためです。そのため、そのページのURLでローカルホストの代わりにIPを使用していたため、実際にはセッションが異なる別のWebサイトと見なされていました。

要約すれば

IIS Expressの代わりにIISでホストされているアプリケーションをデバッグし、マシンhttp:// Iphttp:// localhostをさまざまなページに混在させる場合は、さらに注意を払います


1

私の問題は、Microsoft MediaRoom IPTVアプリケーションに関するものでした。MPF MRMLアプリケーションはCookieをサポートしていないことがわかりました。web.configでcookielessセッションを使用するように変更すると、問題が解決しました

<sessionState cookieless="true"  />

これに関する本当に古い記事があります: Cookieless ASP.NET


1

私は.NET Core 2.1を使用していますが、問題はCoreに関するものではないことを十分に認識しています。それでもインターネットが不足していて、Googleが私をここに連れてきたので、誰かを数時間救うことを望んでいます。


Startup.cs

services.AddCors(o => o.AddPolicy("AllowAll", builder =>
            {
                builder
                    .WithOrigins("http://localhost:3000")     // important
                    .AllowCredentials()                       // important
                    .AllowAnyMethod()
                    .AllowAnyHeader();       // obviously just for testing
            }));

client.js

const resp = await fetch("https://localhost:5001/api/user", {
            method: 'POST',
            credentials: 'include',                           // important
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(data)
        })

Controllers/LoginController.cs

namespace WebServer.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UserController : ControllerBase
    {
        [HttpPost]
        public IEnumerable<string> Post([FromBody]LoginForm lf)
        {
            string prevUsername = HttpContext.Session.GetString("username");
            Console.WriteLine("Previous username: " + prevUsername);

            HttpContext.Session.SetString("username", lf.username);

            return new string[] { lf.username, lf.password };
        }
    }
}

セッションの書き込みと読み取りは機能しますが、ブラウザにCookieが渡されないようです。少なくとも "Set-Cookie"ヘッダーはどこにも見つかりませんでした。



0

非常に短いセッションタイムアウトがないことを確認してください。また、Cookieベースのセッションを使用している場合は、セッションを受け入れていることを確認してください。

FireFox webDeveloperToolbarは、アプリケーションに設定されたCookieを確認できるため、このような場合に役立ちます。


2
セッションタイムアウトが1秒未満に設定されていないと思います。F5キーを押すたびに変化します。
Seb Nilsson

0

セッションIDのリセットには多くの原因が考えられます。ただし、上記のいずれも私の問題とは関係ありません。そのため、今後の参考のために説明します。

私の場合、各リクエストで作成された新しいセッションが無限のリダイレクトループを引き起こしました。リダイレクトアクションはOnActionExecutingイベントで発生します。

また、クライアント側でサイトをキャッシュしないようにするために、(Response.ClearHeadersメソッドを使用してOnActionExecutingイベントでも)すべてのhttpヘッダーをクリアしています。ただし、この方法では、ユーザーのセッションに関する情報を含むすべてのヘッダーが消去され、結果として一時記憶域(後でプログラムで使用していたもの)のすべてのデータが消去されます。そのため、Session_Startイベントで新しいセッションを設定しても効果がありませんでした。

私の問題を解決するために、リダイレクトが発生したときにヘッダーを削除しないようにしました。

それが誰かを助けることを願っています。


0

私はこの問題に別の方法で遭遇しました。[SessionState(SessionStateBehavior.ReadOnly)]アプリの起動時に元のセッションで値を設定したにもかかわらず、この属性を持つコントローラーは別のセッションから読み取っていました。私は_layout.cshtmlを介してセッション値を追加していました(おそらく最善のアイデアではないでしょうか?)

属性を削除したときに元のセッション(およびSessionId)がそのまま残るため、これは明らかにReadOnlyが問題の原因でした。クラウディオ/マイクロソフトのソリューションを使用してそれを修正しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.