[asp.net] ASP.NET : 요청 간 Session.SessionID 변경

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

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

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

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



답변

이것이 이유 다

쿠키 기반 세션 상태를 사용하는 경우 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;
}


답변

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

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

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


답변

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


답변

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

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

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

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

SSL을 켜십시오


답변

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


답변

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

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

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


답변

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

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