ASP.NET: Session.SessionID perubahan antar permintaan

142

Mengapa properti SessionID di Sesi -objek di halaman ASP.NET-perubahan antara permintaan?

Saya memiliki halaman seperti ini:

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

Dan outputnya terus berubah setiap kali saya menekan F5, terlepas dari browser.

Seb Nilsson
sumber

Jawaban:

225

Ini alasannya

Saat menggunakan keadaan sesi berbasis cookie, ASP.NET tidak mengalokasikan penyimpanan untuk data sesi sampai objek Sesi digunakan. Akibatnya, ID sesi baru dihasilkan untuk setiap permintaan halaman hingga objek sesi diakses. Jika aplikasi Anda memerlukan ID sesi statis untuk seluruh sesi, Anda bisa mengimplementasikan metode Session_Start dalam file Global.asax aplikasi dan menyimpan data dalam objek Sesi untuk memperbaiki ID sesi, atau Anda dapat menggunakan kode di bagian lain dari Anda aplikasi untuk secara eksplisit menyimpan data dalam objek Sesi.

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

Jadi pada dasarnya, kecuali Anda mengakses objek sesi di backend, sessionId baru akan dibuat dengan setiap permintaan

EDIT

Kode ini harus ditambahkan pada file Global.asax. Itu menambahkan entri ke objek Sesi sehingga Anda memperbaiki sesi sampai berakhir.

protected void Session_Start(Object sender, EventArgs e) 
{
    Session["init"] = 0;
}
Claudio Redi
sumber
23
Saya tidak tahu itu, tidak pernah punya masalah dengan itu tapi itu menarik untuk diketahui
Pharabus
1
@Cladudio dapatkah Anda hanya memasukkan satu baris kode dan jawaban Anda sempurna. Informasi menarik keluar dari pertanyaan menarik ... plus satu? ;)
Seb Nilsson
2
Cukup menarik, ini memperbaiki masalah saya - tetapi masalah hanya terwujud setelah sekitar 6 bulan menggunakan basis kode tanpa masalah. Saya tidak dapat memikirkan alasan mengapa hal ini tiba-tiba berubah - adakah yang bisa menyarankan alasan mengapa sessionid tiba-tiba akan direset ketika sebelumnya tidak?
Moo
2
@KumarHarsh: setelah Anda menyimpan objek apa pun di sesi, id sesi akan diperbaiki. Itulah yang ingin saya katakan dengan "kecuali Anda mengakses objek sesi Anda di backend ...". Setelah Anda menetapkan someidsesi, apakah akan tetap sama. Mempertimbangkan bahwa jawaban ini lebih dari 4 tahun, tidak yakin apakah ada modifikasi dalam kaitannya dengan ini.
Claudio Redi
9
Saya perhatikan bahwa hanya menambahkan metode Session_Start DENGAN TIDAK ADA DI DALAMNYA ke Global.asax saya berhasil. Terima kasih @Claudio untuk tipnya.
Pedro
92

Ada alasan lain yang lebih berbahaya, mengapa hal ini dapat terjadi bahkan ketika objek Sesi telah diinisialisasi seperti yang ditunjukkan oleh Cladudio.

Di Web.config, jika ada <httpCookies>entri yang diatur ke requireSSL="true"tetapi Anda tidak benar-benar menggunakan HTTPS: untuk permintaan tertentu, maka cookie sesi tidak dikirim (atau mungkin tidak dikembalikan, saya tidak yakin yang mana) yang berarti Anda berakhir dengan sesi baru untuk setiap permintaan.

Saya menemukan ini dengan cara yang sulit, menghabiskan beberapa jam bolak-balik antara beberapa komit dalam kontrol sumber saya, sampai saya menemukan perubahan spesifik apa yang telah merusak aplikasi saya.

Neville Cook
sumber
5
Saya tahu ini tetapi masih melupakannya setiap 3 bulan atau lebih dan menghabiskan beberapa jam untuk debugging ..
sotn
Dalam kasus saya, saya menguji pada localhost dan "requireSSL" di web.config ditetapkan sebagai "true". Terima kasih.
William Pereira
ini adalah kasus saya, dan saya menghabiskan terlalu banyak waktu untuk mencari tahu (memiliki ikan hering merah dengan file web.config yang berbeda).
jmoreno
Saran Anda di atas masih membantu di tahun 2018. Ini adalah skenario yang paling sering. Terima kasih!
Vijay Bansal
5

Dalam kasus saya, saya mengetahui bahwa cookie sesi memiliki domain yang menyertakan www.awalan, sementara saya meminta halaman tanpa www..
Menambahkan www.ke URL segera memperbaiki masalah. Kemudian saya mengubah domain cookie untuk diatur menjadi .mysite.combukan www.mysite.com.

Kniganapolke
sumber
5

masalah saya adalah bahwa kami memiliki set ini di web.config

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

ini berarti bahwa ketika debugging di non-SSL (default), cookie auth tidak akan dikirim kembali ke server. ini berarti bahwa server akan mengirim cookie auth baru (dengan sesi baru) untuk setiap permintaan kembali ke klien.

cara mengatasinya adalah dengan menetapkan keharusan ke false di web.config dan true di web.release.config atau mengaktifkan SSL saat debugging:

nyalakan SSL

Astaga
sumber
Apa bedanya dengan jawaban Neville Cook dari 2011?
Ian Kemp
4

Menggunakan jawaban Neville (menghapus membutuhkanSSL = true, di web.config) dan sedikit memodifikasi kode Joel Etherton, berikut adalah kode yang harus menangani situs yang berjalan dalam mode SSL dan mode non SSL, tergantung pada pengguna dan halaman (saya) Saya melompat kembali ke kode dan belum mengujinya di SSL, tetapi berharap itu akan berfungsi - akan terlalu sibuk nanti untuk kembali ke ini, jadi ini dia:

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;
                }
            }
        }
Reid
sumber
2

Kemungkinan lain yang menyebabkan SessionID berubah di antara permintaan, bahkan ketika Session_OnStart didefinisikan dan / atau Session telah diinisialisasi, adalah bahwa hostname URL berisi karakter yang tidak valid (seperti garis bawah). Saya percaya ini khusus IE (tidak diverifikasi), tetapi jika URL Anda, katakanlah http://server_name/app, maka IE akan memblokir semua cookie dan informasi sesi Anda tidak akan dapat diakses di antara permintaan.

Bahkan, setiap permintaan akan memunculkan sesi terpisah di server, jadi jika halaman Anda berisi beberapa gambar, tag skrip, dll., Maka masing-masing permintaan GET akan menghasilkan sesi yang berbeda di server.

Informasi lebih lanjut: http://support.microsoft.com/kb/316112

R. Aaron Zupancic
sumber
2

Dalam kasus saya ini banyak terjadi di lingkungan pengembangan dan pengujian saya. Setelah mencoba semua solusi di atas tanpa hasil, saya menemukan bahwa saya dapat memperbaiki masalah ini dengan menghapus semua cookie sesi. Ekstensi pengembang web membuat ini sangat mudah dilakukan. Saya kebanyakan menggunakan Firefox untuk pengujian dan pengembangan, tetapi ini juga terjadi saat pengujian di Chrome. Perbaikannya juga bekerja di Chrome.

Saya belum harus melakukan ini di lingkungan produksi dan belum menerima laporan orang tidak bisa masuk. Ini juga sepertinya hanya terjadi setelah membuat cookie sesi menjadi aman. Itu tidak pernah terjadi di masa lalu ketika mereka tidak aman.

Matt L
sumber
Pembaruan: ini hanya mulai terjadi setelah kami mengubah cookie sesi untuk membuatnya aman. Saya telah menentukan bahwa masalah sebenarnya disebabkan oleh ada dua atau lebih cookie sesi di browser dengan jalur dan domain yang sama. Yang selalu menjadi masalah adalah yang memiliki nilai kosong atau nol. Setelah menghapus cookie tertentu, masalah terselesaikan. Saya juga menambahkan kode dalam metode Sessin_Start Global.asax.cs untuk memeriksa cookie kosong ini dan jika demikian atur tanggal kedaluwarsanya ke sesuatu di masa lalu.
Matt L
2

dalam kasus saya itu karena saya memodifikasi sesi setelah mengalihkan dari gateway di aplikasi eksternal , jadi karena saya menggunakan IP sebagai gantinya di localhost di url halaman itu sebenarnya dianggap situs web yang berbeda dengan sesi yang berbeda.

Singkatnya

lebih memperhatikan jika Anda debug aplikasi yang di-host di IIS daripada IIS express dan mencampur mesin Anda http: // Ip dan http: // localhost di berbagai halaman

Iman
sumber
1

Masalah saya adalah dengan aplikasi Microsoft MediaRoom IPTV. Ternyata aplikasi MRML MPF tidak mendukung cookie; mengubah menggunakan sesi tanpa masak di web.config memecahkan masalah saya

<sessionState cookieless="true"  />

Berikut ini adalah artikel yang BENAR-BENAR tua tentang hal itu: ASP.NET Cookieless

denvercoder9
sumber
1

Saya menggunakan .NET Core 2.1 dan saya sangat menyadari bahwa pertanyaannya bukan tentang Core. Namun internet kurang dan Google membawa saya ke sini sehingga berharap untuk menyelamatkan seseorang beberapa jam.


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 };
        }
    }
}

Perhatikan bahwa sesi menulis dan membaca berfungsi, namun sepertinya tidak ada cookie yang diteruskan ke browser. Setidaknya saya tidak dapat menemukan tajuk "Set-Cookie" di mana saja.

krivar
sumber
0

Pastikan Anda tidak memiliki batas waktu sesi yang sangat singkat, dan juga pastikan bahwa jika Anda menggunakan sesi berbasis cookie, Anda menerima sesi.

FireFox webDeveloperToolbar sangat membantu pada saat-saat seperti ini karena Anda dapat melihat cookie ditetapkan untuk aplikasi Anda.

Penjual Mitchel
sumber
2
Saya menduga batas waktu sesi saya tidak diatur di bawah satu detik. Itu berubah dengan setiap F5-press cepat.
Seb Nilsson
0

Reset ID sesi mungkin memiliki banyak penyebab. Namun apapun yang disebutkan di atas tidak berhubungan dengan masalah saya. Jadi saya akan menjelaskannya untuk referensi di masa mendatang.

Dalam kasus saya, sesi baru yang dibuat pada setiap permintaan menghasilkan loop pengalihan tak terbatas. Tindakan pengalihan berlangsung di acara OnActionExecuting .

Juga saya telah membersihkan semua header http (juga dalam acara OnActionExecuting menggunakan metode Response.ClearHeaders ) untuk mencegah situs caching di sisi klien. Tapi metode itu membersihkan semua header termasuk informasi tentang sesi pengguna, dan akibatnya semua data dalam penyimpanan Temp (yang saya gunakan nanti dalam program). Jadi, bahkan mengatur sesi baru di acara Session_Start tidak membantu.

Untuk mengatasi masalah saya, saya memastikan untuk tidak menghapus header saat pengalihan.

Semoga ini bisa membantu seseorang.

pengguna3253726
sumber
0

Saya mengalami masalah ini dengan cara yang berbeda. Pengontrol yang memiliki atribut [SessionState(SessionStateBehavior.ReadOnly)]ini membaca dari sesi yang berbeda meskipun saya telah menetapkan nilai di sesi asli saat memulai aplikasi. Saya menambahkan nilai sesi melalui _layout.cshtml (mungkin bukan ide terbaik?)

Itu jelas ReadOnly yang menyebabkan masalah karena ketika saya menghapus atribut, sesi asli (dan SessionId) akan tetap berlaku. Menggunakan solusi Claudio / Microsoft memperbaikinya.

goku_da_master
sumber