ASP.NET: Session.SessionID istekleri arasında değişir.


142

Neden mülkiyet vermez sessionid üzerinde Oturum istekleri arasında bir ASP.NET sayfalık değişimde -Nesne?

Ben böyle bir sayfa var:

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

Tarayıcıdan bağımsız olarak F5'e her basışımda çıkış sürekli değişiyor.

Yanıtlar:


225

Sebep bu

Çerez tabanlı oturum durumu kullanılırken, Oturum nesnesi kullanılana kadar ASP.NET oturum verileri için depolama alanı ayırmaz. Sonuç olarak, oturum nesnesine erişilene kadar her sayfa isteği için yeni bir oturum kimliği oluşturulur. Uygulamanız oturumun tamamı için statik bir oturum kimliği gerektiriyorsa, uygulamanın Global.asax dosyasında Session_Start yöntemini uygulayabilir ve oturum kimliğini düzeltmek için verileri Oturum nesnesine depolayabilir veya kodunuzun başka bir bölümündeki kodu kullanabilirsiniz verileri oturum nesnesinde açıkça depolamak için uygulama.

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

Temel olarak, arka taraftaki oturum nesnenize erişmediğiniz sürece, her istekle yeni bir sessionId oluşturulur

DÜZENLE

Bu kod Global.asax dosyasına eklenmelidir. Oturum nesnesine bir girdi ekler, böylece oturumu süresi dolana kadar düzeltirsiniz.

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

23
Bunu bilmiyordum, onunla hiç bir sorun yaşamadım ama bunu bilmek ilginç
Pharabus

1
@Cladudio sadece bir satır kod atabilir ve cevabınız mükemmel. İlginç bir sorudan çıkan ilginç bilgiler ... artı bir soru? ;)
Seb Nilsson

2
İlginç bir şekilde, bu sorunumu düzeltir - ancak sorun sadece kod tabanını yaklaşık 6 ay sorunsuz bir şekilde kullandıktan sonra kendini gösterdi. Bunun aniden değişmesinin bir sebebini düşünemiyorum - kimse sessionid'in daha önce olmadığında aniden sıfırlanmasının bir nedenini önerebilir mi?
Moo

2
@KumarHarsh: herhangi bir nesneyi oturumda sakladığınızda, oturum kimliği düzeltilecektir. "Arka uçtaki oturum nesnenize erişmediğiniz sürece ..." ile söylemek istediğim buydu. someidOturumu atadığınızda aynı kalır. Bu cevabın 4 yaşından büyük olduğunu göz önünde bulundurun, bununla ilgili herhangi bir değişiklik olup olmadığından emin değilim.
Claudio Redi

9
Ben Global.asax benim hiçbir şey Session_Start yöntemi ekleyerek bu iş yaptı fark ettim. İpucu için teşekkürler @Claudio.
Pedro

92

Oturum nesnesi Cladudio tarafından gösterildiği gibi başlatılmış olsa bile, bunun daha sinsi bir nedeni daha olabilir.

Web.config dosyasında, <httpCookies>ayarlanmış bir giriş varsa requireSSL="true"ancak aslında HTTPS kullanmıyorsanız: belirli bir istek için oturum çerezi gönderilmez (veya döndürülmez, hangisi olduğundan emin değilim). her istek için yepyeni bir oturumla sonuçlanır.

Bunu zor bir şekilde buldum, kaynak kontrolümdeki birkaç taahhüt arasında birkaç saat harcayarak, hangi özel değişikliğin uygulamamı bozduğunu bulana kadar buldum.


5
Bunu biliyordum ama yine de her 3 ayda bir unutmak ve hata ayıklama birkaç saat harcamak ..
sotn

Benim durumumda, ben localhost üzerinde test edildi ve web.config içinde "requirSSL" "doğru" olarak ayarlandı. Teşekkürler.
William Pereira

Bu benim durumumdu ve anlamaya çalışmak için çok fazla zaman harcadım (farklı web.config dosyalarıyla kırmızı bir ringa balığı vardı).
jmoreno

Yukarıdaki öneriniz 2018'de hala yardımcı oluyor. Bu en sık karşılaşılan senaryodur. Teşekkürler!
Vijay Bansal

5

Benim durumumda , hayır ile sayfa isterken oturum çerezinin önek içeren bir alan adı olduğunu anladım . URL'ye eklemek sorunu hemen çözdü. Daha sonra bunun yerine ayarlanacak çerezin alan adını değiştirdim .www.www.
www..mysite.comwww.mysite.com


5

benim sorunum web.config bu set vardı oldu

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

Bu, SSL olmayan (varsayılan) hata ayıklama yaparken, kimlik doğrulama çerezinin sunucuya geri gönderilmeyeceği anlamına gelir. bu, sunucunun istemciye geri gelen her istek için yeni bir yetkilendirme çerezi (yeni bir oturumla) göndereceği anlamına gelir.

düzeltme, web.config dosyasında requiressl öğesini false, web.release.config dosyasında true olarak ayarlamak veya hata ayıklama sırasında SSL'yi açmaktır:

SSL'yi aç


Bu Neville Cook'un 2011'deki cevabı ile arasındaki fark nedir?
Ian Kemp

4

Neville'in cevabını kullanarak (web.config'de requirSSL = true ifadesini silmek) ve Joel Etherton'un kodunu biraz değiştirerek, kullanıcıya ve sayfaya bağlı olarak hem SSL modunda hem de SSL olmayan modda çalışan bir siteyi işlemesi gereken kod (I koda geri atlıyorum ve henüz SSL'de test etmedim, ancak çalışmasını bekliyorum - daha sonra buna geri dönmek için çok meşgul olacak, işte burada:

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 tanımlanmış ve / veya bir Oturum başlatılmış olsa bile SessionID değerinin istekler arasında değişmesine neden olan başka bir olasılık, URL ana bilgisayar adının geçersiz bir karakter (alt çizgi gibi) içermesidir. Bunun IE'ye özgü (doğrulanmadı) olduğuna inanıyorum, ancak URL'niz diyelim ki http://server_name/appIE tüm çerezleri engelleyecek ve oturum bilgilerinize istekler arasında erişilemeyecek.

Aslında, her istek sunucuda ayrı bir oturum açar, bu nedenle sayfanızda birden fazla resim, komut dosyası etiketi vb. Varsa, bu GET isteklerinin her biri sunucuda farklı bir oturumla sonuçlanır.

Daha fazla bilgi: http://support.microsoft.com/kb/316112


2

Benim durumumda bu, geliştirme ve test ortamlarımda çok şey oluyor. Yukarıdaki çözümlerin hiçbirini başarılı olmadan denedikten sonra, tüm oturum çerezlerini silerek bu sorunu çözebildiğimi buldum. Web geliştirici uzantısı bunu yapmayı çok kolaylaştırıyor. Test ve geliştirme için çoğunlukla Firefox kullanıyorum, ancak bu aynı zamanda Chrome'da test ederken de oldu. Düzeltme ayrıca Chrome'da da çalıştı.

Bunu henüz üretim ortamında yapmak zorunda kalmadım ve giriş yapamayan insanların raporlarını almadım. Bu da sadece oturum çerezlerini güvenli hale getirdikten sonra gerçekleşti. Geçmişte hiç güvenli olmadıkları zaman olmadı.


Güncelleme: Bu ancak oturum çerezini güvenli hale getirmek için değiştirdikten sonra gerçekleşmeye başladı. Tam sorunun tarayıcıda aynı yol ve etki alanına sahip iki veya daha fazla oturum çerezi olmasından kaynaklandığını belirledim. Her zaman sorun olan, boş veya null değeri olan problemdi. Söz konusu çerez silindikten sonra sorun çözüldü. Ayrıca, bu boş çerezi kontrol etmek için Global.asax.cs Sessin_Start yönteminde kod ekledim ve öyleyse, son kullanma tarihini geçmişte bir şeye ayarlayın.
Matt L

2

benim durumumda, harici bir uygulamada bir ağ geçidinden yönlendirme yaptıktan sonra oturumu değiştiriyordum , bu yüzden bu sayfa url'sinde localhost yerine IP kullandığım için aslında farklı oturumlara sahip farklı bir web sitesi olarak kabul edildi.

Özetle

IIS'de barındırılan bir uygulamanın hatalarını IIS express yerine hata ayıklıyor ve makinenizi çeşitli sayfalarda http: // Ip ve http: // localhost ile karıştırıyorsanız daha fazla dikkat edin


1

Benim sorunum bir Microsoft MediaRoom IPTV uygulamasıyla ilgiliydi. MPF MRML uygulamalarının çerezleri desteklemediği ortaya çıkıyor; web.config içinde çerezsiz oturumlar kullanmak için değiştirmek sorunumu çözdü

<sessionState cookieless="true"  />

İşte bu konuda gerçekten eski bir makale: Cookieless ASP.NET


1

.NET Core 2.1 üzerindeyim ve sorunun Core ile ilgili olmadığının farkındayım. Yine de internet yok ve Google beni birkaç saat kurtarmayı umarak buraya getirdi.


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

Oturum yazma ve okuma işlemlerinin işe yaradığına dikkat edin, ancak tarayıcıya hiç çerez geçirilmemiş gibi görünüyor. En azından hiçbir yerde bir "Set-Cookie" başlığı bulamadım.



0

Çok kısa bir oturum zaman aşımına sahip olmadığınızdan emin olun ve ayrıca çerez tabanlı oturumlar kullanıyorsanız oturumu kabul ettiğinizden emin olun.

FireFox webDeveloperToolbar, uygulamanız için ayarlanmış çerezleri görebileceğiniz gibi bu gibi zamanlarda yararlıdır.


2
Oturum zaman aşımı süresinin bir saniyenin altına ayarlanmadığını tahmin ediyorum. Her hızlı F5 tuşuna basıldığında değişir.
Seb Nilsson

0

Oturum Kimliği sıfırlamanın birçok nedeni olabilir. Ancak yukarıda belirtilenler benim sorunumla ilgili değil. Bu yüzden ileride başvurmak üzere açıklayacağım.

Benim durumumda, her istek üzerine oluşturulan yeni bir oturum sonsuz yönlendirme döngüsüyle sonuçlandı. Yönlendirme eylemi OnActionExecuting olayında gerçekleşir.

Ayrıca , istemci tarafında önbellek sitelerini önlemek için tüm http üstbilgilerini ( Response.ClearHeaders yöntemini kullanarak OnActionExecuting olayında) da temizledim . Ancak bu yöntem, kullanıcının oturumu hakkındaki bilgiler de dahil olmak üzere tüm üstbilgileri ve sonuç olarak Temp depolamadaki tüm verileri temizler (daha sonra programda kullanıyordum). Session_Start etkinliğinde yeni oturum ayarlamak bile yardımcı olmadı.

Sorunumu çözmek için, bir yönlendirme gerçekleştiğinde başlıkları kaldırmamaya çalıştım.

Umarım birine yardımcı olur.


0

Bu konuya farklı bir şekilde girdim. Bu özelliğe sahip denetleyiciler[SessionState(SessionStateBehavior.ReadOnly)]Uygulama başlatıldıktan sonra orijinal oturumda bir değer ayarlamış olmama rağmen farklı bir oturumdan okuyorlardı. Oturum değerini _layout.cshtml aracılığıyla ekliyordum (belki de en iyi fikir değil mi?)

Özniteliği kaldırdığımda, orijinal oturum (ve SessionId) incelik içinde kalacağı için açıkça ReadOnly soruna neden oldu. Claudio'nun / Microsoft'un çözümünü kullanmak sorunu çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.