programing

ASP.NET: 세션입니다.요청 간에 SessionID가 변경됩니다.

showcode 2023. 4. 25. 23:48
반응형

ASP.NET: 세션입니다.요청 간에 SessionID가 변경됩니다.

속성 세션이 실행되는 이유는 무엇입니까?ASP의 Session-object에 있는 ID입니다.요청 간의 NET 페이지 변경은 무엇입니까?

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

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

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

이것이 이유입니다.

쿠키 기반 세션 상태(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 파일에 추가해야 합니다.세션 개체에 항목이 추가되므로 세션이 만료될 때까지 세션을 수정할 수 있습니다.

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

Cladudio에서 설명한 것처럼 Session 개체가 초기화된 경우에도 이러한 문제가 발생할 수 있는 또 다른 이유가 있습니다.

.config에 .config가 있는 경우 선택합니다.<httpCookies>로로 to to that that that that that that that that that로 설정된 항목입니다.requireSSL="true"HTTPS를 사용합니다. 특정 요청의 경우 세션 쿠키는 전송되지 않으며(또는 반환되지 않을 수도 있습니다), 즉 각 요청에 대해 완전히 새로운 세션이 생성됩니다.

소스 컨트롤에 있는 여러 커밋 사이를 몇 시간씩 오가며 응용 프로그램에 어떤 변화가 있었는지 알아내기 전까지는 이 문제를 어렵게 발견했습니다.

제 경우 세션 쿠키가 다음을 포함하는 도메인을 가지고 있다는 것을 알아냈습니다.www.가 없는 페이지를 요청하는 동안 접두사가 없습니다.www.요.
추가하고 있습니다.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의 답변을 사용합니다(삭제 필요).SSL = true, web.config) 및 Joel Etherton의 코드를 약간 수정한 다음 사용자 및 페이지에 따라 SSL 모드와 비 SSL 모드에서 모두 실행되는 사이트를 처리해야 하는 코드입니다(코드로 다시 이동 중이고 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 호스트 이름에 잘못된 문자(예: 밑줄)가 포함되어 있다는 것입니다.(확인되지 않음)이라고만, 예를 들어, URL이 IE(IE)이면 URL이다.http://server_name/app그러면 IE가 모든 쿠키를 차단하고 요청 간에 세션 정보에 액세스할 수 없습니다.

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

자세한 내용은 http://support.microsoft.com/kb/316112를 참조하십시오.

제 문제는 Microsoft MediaRoom IPTV 애플리케이션에 관한 것이었습니다.MPF MRML 응용 프로그램은 쿠키를 지원하지 않습니다. 웹에서 쿠키 없는 세션을 사용하도록 변경하면 문제가 해결되었습니다.

<sessionState cookieless="true"  />

여기 쿠키리스 ASP라는 정말 오래된 기사가 있습니다.그물망입니다.

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

요약하면요

IIS Express 대신 IIS에서 호스트된 애플리케이션을 디버깅하고 여러 페이지에서 시스템 http://Ip와 http://localhost를 혼합하는 경우 더욱 주의하십시오.

제 경우 개발 및 테스트 환경에서 이러한 일이 많이 발생했습니다.위의 모든 해결 방법을 시도해 보았으나 아무런 성공 없이 모든 세션 쿠키를 삭제하여 이 문제를 해결할 수 있었습니다.웹 개발자 확장은 이를 매우 쉽게 만듭니다.저는 주로 테스트와 개발을 위해 파이어폭스를 사용하지만 크롬에서 테스트하는 동안에도 이런 일이 있었습니다.이 수정은 크롬에서도 작동했습니다.

아직 프로덕션 환경에서 이 작업을 수행할 필요가 없었고 로그인을 할 수 없다는 보고도 받지 못했습니다.이 역시 세션 쿠키를 안전하게 만든 후에만 발생하는 것으로 보입니다.과거에 그들이 안전하지 않았을 때는 그런 일이 없었습니다.

업데이트: 세션 쿠키를 안전하게 변경한 후에만 이 문제가 발생하기 시작했습니다.브라우저에 동일한 경로와 도메인을 가진 두 개 이상의 세션 쿠키가 있기 때문에 정확한 문제가 발생했음을 확인했습니다.항상 문제가 되는 것은 값이 비어 있거나 null인 것입니다.해당 쿠키를 삭제한 후 문제가 해결되었습니다.또한 Global.asax.cs Sessin_Start 메서드에 코드를 추가하여 이 빈 쿠키를 확인하고 만약 있다면 만료 날짜를 과거로 설정했습니다.

HttpCookieCollection cookies = Response.Cookies;
for (int i = 0; i < cookies.Count; i++)
{
    HttpCookie cookie = cookies.Get(i);

    if (cookie != null)
    {
        if ((cookie.Name == "ASP.NET_SessionId" || cookie.Name == "ASP.NET_SessionID") && String.IsNullOrEmpty(cookie.Value))
        {
            //Try resetting the expiration date of the session cookie to something in the past and/or deleting it.
            //Reset the expiration time of the cookie to one hour, one minute and one second in the past
            if (Response.Cookies[cookie.Name] != null)
                Response.Cookies[cookie.Name].Expires = DateTime.Today.Subtract(new TimeSpan(1, 1, 1));
        }
    }
}

이것은 로 시작하는 저에게 있어서 변화하고 있었습니다.NET 4.7.2 세션 쿠키의 SameSite 속성 때문입니다.자세한 내용은 https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/를 참조하십시오.

기본값이 "Lax"로 변경되어 문제가 발생하기 시작했습니다."없음"으로 변경했는데 예상대로 작동했어요.

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

FireFox 웹 개발자입니다.이러한 경우 응용 프로그램에 설정된 쿠키를 볼 수 있으므로 도구 모음이 유용합니다.

세션 ID 재설정에는 여러 가지 원인이 있을 수 있습니다.하지만 위에 언급된 어떤 것도 제 문제와 관련이 없습니다.그래서 나중에 참고할 수 있도록 설명하겠습니다.

이 경우 각 요청에 대해 생성된 새 세션으로 인해 무한 리디렉션 루프가 발생했습니다.리디렉션 작업은 OnAction에서 수행됩니다.이벤트를 실행하는 중입니다.

또한 모든 http 헤더를 지우고 있습니다(OnAction에서도).응답을 사용하여 이벤트를 실행합니다.ClearHeaders 메서드)를 사용하여 클라이언트 측에서 사이트를 캐싱하지 않도록 합니다.그러나 이 방법은 사용자 세션에 대한 정보를 포함한 모든 헤더를 지우고, 결과적으로 Temp 스토리지의 모든 데이터(나중에 프로그램에서 사용 중)를 지웁니다.따라서 Session_Start 이벤트에서 새 세션을 설정해도 도움이 되지 않습니다.

문제를 해결하기 위해 리디렉션 시 헤더를 제거하지 않도록 했습니다.

도움이 됐으면 좋겠네요

저는 이 문제에 다른 방법으로 부딪혔어요.이 특성을 가진 컨트롤러입니다.[SessionState(SessionStateBehavior.ReadOnly)]앱을 시작할 때 원래 세션에 값을 설정했는데도 다른 세션에서 읽었습니다._layout.cshtml을 통해 세션 값을 추가하고 있었습니다(최선이 아닐 수도 있음).

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

하고 있어요.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" 헤더는 어디에서도 찾을 수 없었습니다.

언급URL : https://stackoverflow.com/questions/2874078/asp-net-session-sessionid-changes-between-requests 입니다.

반응형