ASP.NET : 요청 간 Session.SessionID 변경


142

왜 속성은 않는 세션 ID세션 요청 사이의 ASP.NET 페이지 변화 -object?

다음과 같은 페이지가 있습니다.

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

브라우저와 관계없이 F5를 누를 때마다 출력이 계속 변경됩니다.

답변:


225

이것이 이유 다

쿠키 기반 세션 상태를 사용하는 경우 ASP.NET은 Session 개체를 사용할 때까지 세션 데이터에 저장소를 할당하지 않습니다. 결과적으로 세션 오브젝트에 액세스 할 때까지 각 페이지 요청에 대해 새 세션 ID가 생성됩니다. 응용 프로그램이 전체 세션에 대해 정적 세션 ID를 필요로하는 경우 응용 프로그램의 Global.asax 파일에서 Session_Start 메서드를 구현하고 세션 개체에 데이터를 저장하여 세션 ID를 수정하거나 다른 부분에서 코드를 사용할 수 있습니다 응용 프로그램은 명시 적으로 Session 객체에 데이터를 저장합니다.

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

따라서 기본적으로 백엔드에서 세션 객체에 액세스하지 않으면 각 요청마다 새로운 sessionId가 생성됩니다.

편집하다

이 코드는 Global.asax 파일에 추가해야합니다. 세션 개체에 항목을 추가하므로 세션이 만료 될 때까지 수정합니다.

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

23
나는 그것을 몰랐다, 그것에 문제가 없었지만 그것은 흥미 롭다
Pharabus

1
@Cladudio는 한 줄의 코드로 던질 수 있으며 귀하의 답변은 완벽합니다. 흥미로운 질문에서 나오는 흥미로운 정보 ... 플러스 하나? ;)
Seb Nilsson

2
흥미롭게도 이것은 내 문제를 해결하지만 문제는 코드베이스를 약 6 개월 사용한 후에 만 ​​문제가 발생했습니다. 나는 이것이 갑자기 바뀌는 이유를 생각할 수 없다. 누군가 sessionid가 이전에 그렇지 않았을 때 갑자기 리셋되는 이유를 제안 할 수 있습니까?
Moo

2
@ KumarHarsh : 세션에 객체를 저장하면 세션 ID가 수정됩니다. "백엔드에서 세션 객체에 액세스하지 않는 한 ..."이라고 말하는 것입니다. someid세션 을 할당 하면 동일한 상태로 유지됩니다. 이 답변의 나이가 4 세 이상이라는 점을 고려하십시오. 이와 관련하여 수정이 있는지 확실하지 않습니다.
Claudio Redi

9
Global.asax에 Session_Start 메소드 WITH NOTHING IN IT를 추가하면이 작업을 수행하는 것으로 나타났습니다. 팁을 주신 @Claudio에게 감사드립니다.
Pedro

92

Cladudio가 설명하는 것처럼 Session 객체가 초기화 된 경우에도이 문제가 발생할 수있는 더 교활한 이유가 있습니다.

Web.config에서 <httpCookies>항목이 설정 requireSSL="true"되었지만 실제로 HTTPS를 사용하지 않는 항목 이있는 경우 : 특정 요청에 대해 세션 쿠키가 전송되지 않거나 반환되지 않을 수도 있습니다. 각 요청마다 새로운 세션으로 끝납니다.

나는이 변경이 어려운 것을 발견했으며, 소스 컨트롤의 여러 커밋 사이에서 몇 시간을주고받으며 어떤 특정 변경 사항이 내 응용 프로그램을 손상 시켰는지 알았습니다.


5
나는 이것을 알고 있었지만 3 개월마다 그것을 잊어
버렸고

필자의 경우 로컬 호스트에서 테스트 중이며 web.config의 "requireSSL"이 "true"로 설정되었습니다. 감사.
William Pereira

이것은 나의 경우 였고, 그것을 알아 내려고 너무 많은 시간을 보냈습니다 (다른 web.config 파일을 가진 빨간 청어가있었습니다).
jmoreno

위의 제안은 2018 년에도 여전히 도움이됩니다. 이것은 가장 빈번한 시나리오입니다. 감사!
Vijay Bansal

5

필자의 경우 세션 쿠키에 접두사 가 포함 된 도메인www.있고 no로 페이지를 요청하는 것으로 나타났습니다 www.. URL에
추가하면 www.즉시 문제가 해결되었습니다. 나중에 쿠키 도메인을 .mysite.com대신 로 설정하도록 변경했습니다 www.mysite.com.


5

내 문제는 우리가 web.config 에서이 세트를 가지고 있다는 것입니다.

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

이는 비 SSL (기본값)에서 디버깅 할 때 인증 쿠키가 서버로 다시 전송되지 않음을 의미합니다. 이는 서버가 모든 요청에 ​​대해 새 인증 쿠키 (새 세션 포함)를 클라이언트에게 다시 보내는 것을 의미합니다.

수정은 web.config에서 requiresl을 false로 설정하고 web.release.config에서 true로 설정하거나 디버깅하는 동안 SSL을 켜는 것입니다.

SSL을 켜십시오


2011 년의 네빌 쿡의 답변과 다른 점은 무엇입니까?
이안 켐프

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가 정의되거나 세션이 초기화 된 경우에도 세션 ID가 요청간에 변경 될 수있는 다른 가능성은 URL 호스트 이름에 유효하지 않은 문자 (예 : 밑줄)가 포함되어 있다는 것입니다. 나는 이것이 IE 특정 (검증되지 않음)이라고 생각하지만 귀하의 URL이 (예 http://server_name/app:)이면 IE는 모든 쿠키를 차단하고 요청간에 세션 정보에 액세스 할 수 없습니다.

실제로 각 요청은 서버에서 별도의 세션을 시작하므로 페이지에 여러 이미지, 스크립트 태그 등이 포함 된 경우 각 GET 요청은 서버에서 다른 세션을 발생시킵니다.

추가 정보 : http://support.microsoft.com/kb/316112


2

필자의 경우 이것은 개발 및 테스트 환경에서 많이 발생했습니다. 성공하지 않고 위의 모든 솔루션을 시도한 후 모든 세션 쿠키를 삭제 하여이 문제를 해결할 수 있음을 발견했습니다. 웹 개발자 확장을 통해이 작업을 매우 쉽게 수행 할 수 있습니다. 나는 주로 테스트 및 개발을 위해 Firefox를 사용하지만 Chrome에서 테스트하는 동안에도 발생했습니다. 이 수정은 Chrome에서도 작동했습니다.

아직 프로덕션 환경에서이 작업을 수행 할 필요가 없었으며 로그인 할 수없는 사용자에 대한 보고서를받지 못했습니다. 세션 쿠키를 안전하게 만든 후에 만 ​​발생하는 것 같습니다. 그들이 안전하지 않은 과거에는 결코 일어나지 않았습니다.


업데이트 : 보안을 위해 세션 쿠키를 변경 한 후에 만 ​​시작되었습니다. 브라우저에 경로와 도메인이 동일한 세션 쿠키가 두 개 이상 있기 때문에 정확한 문제가 발생한 것으로 확인되었습니다. 항상 문제가 된 것은 비어 있거나 null 값을 가진 것입니다. 특정 쿠키를 삭제 한 후 문제가 해결되었습니다. 또한이 빈 쿠키를 확인하기 위해 Global.asax.cs Sessin_Start 메소드에 코드를 추가했으며, 유효 기간이 지난 날짜로 설정했습니다.
Matt L

2

내 경우 에는 외부 응용 프로그램의 게이트웨이에서 리디렉션 한 후 세션 수정했기 때문이었습니다. 했기 때문에 해당 페이지 URL의 localhost 대신 IP를 사용했기 때문에 실제로 다른 세션의 다른 웹 사이트로 간주되었습니다.

요약해서 말하자면

IIS Express 대신 IIS에서 호스팅 된 응용 프로그램을 디버깅하고 다양한 페이지에서 컴퓨터 http : // Iphttp : // localhost 를 혼합하는 경우 더 많은주의를 기울이십시오 .


1

내 문제는 Microsoft MediaRoom IPTV 응용 프로그램과 관련이 있습니다. MPF MRML 응용 프로그램은 쿠키를 지원하지 않습니다. web.config에서 쿠키없는 세션을 사용하도록 변경하면 문제가 해결되었습니다.

<sessionState cookieless="true"  />

쿠키가없는 ASP.NET : 여기에 관한 오래된 기사가 있습니다.


1

.NET Core 2.1을 사용 중이며 Core에 대한 질문이 아니라는 것을 잘 알고 있습니다. 그러나 인터넷이 부족하고 구글은 나를 몇 시간 동안 구해 줄 사람을 데려왔다.


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

세션 쓰기 및 읽기가 작동하지만 쿠키가 브라우저로 전달되지 않는 것 같습니다. 적어도 어디서나 "Set-Cookie"헤더를 찾을 수 없습니다.



0

세션 시간이 매우 짧지 않은지 확인하고 쿠키 기반 세션을 사용중인 경우 세션을 수락하는지 확인하십시오.

FireFox webDeveloperToolbar는 애플리케이션에 설정된 쿠키를 볼 수 있으므로 이와 같은 경우에 유용합니다.


2
세션 시간 초과가 1 초 미만으로 설정되어 있지 않은 것 같습니다. F5를 누를 때마다 바뀝니다.
Seb Nilsson

0

세션 ID 재설정에는 많은 원인이있을 수 있습니다. 그러나 위에서 언급 한 것은 내 문제와 관련이 없습니다. 나중에 참조 할 수 있도록 설명하겠습니다.

필자의 경우 각 요청에서 생성 된 새 세션으로 인해 무한 리디렉션 루프가 발생했습니다. 리디렉션 작업은 OnActionExecuting 이벤트에서 발생합니다.

또한 모든 http 헤더를 지우고 있습니다 ( OnActionExecuting 이벤트 에서도 Response.ClearHeaders 사용) 클라이언트 측의 사이트 캐싱을 방지하기 위해 메서드를 있습니다. 그러나이 방법은 사용자 세션에 대한 정보를 포함한 모든 헤더와 결과적으로 Temp 저장 장치의 모든 데이터 (나중에 프로그램에서 사용하고 있음)를 지 웁니다. 따라서 Session_Start 이벤트에서 새 세션을 설정해도 도움이되지 않았습니다.

내 문제를 해결하기 위해 리디렉션이 발생할 때 헤더를 제거하지 않도록했습니다.

그것이 누군가를 돕기를 바랍니다.


0

이 문제를 다른 방식으로 만났습니다. 이 속성을 가진 컨트롤러[SessionState(SessionStateBehavior.ReadOnly)] 앱 시작시 원래 세션에서 값을 설정했지만 다른 세션에서 읽었습니다. _layout.cshtml을 통해 세션 값을 추가했습니다 (최상의 아이디어는 아닐 수도 있습니까?)

속성을 제거 할 때 원래 세션 (및 SessionId)이 그대로 유지되기 때문에 분명히 ReadOnly 문제가 발생했습니다. Claudio / Microsoft 솔루션을 사용하여 문제를 해결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.