답변:
이것이 이유 다
쿠키 기반 세션 상태를 사용하는 경우 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;
}
someid
세션 을 할당 하면 동일한 상태로 유지됩니다. 이 답변의 나이가 4 세 이상이라는 점을 고려하십시오. 이와 관련하여 수정이 있는지 확실하지 않습니다.
Cladudio가 설명하는 것처럼 Session 객체가 초기화 된 경우에도이 문제가 발생할 수있는 더 교활한 이유가 있습니다.
Web.config에서 <httpCookies>
항목이 설정 requireSSL="true"
되었지만 실제로 HTTPS를 사용하지 않는 항목 이있는 경우 : 특정 요청에 대해 세션 쿠키가 전송되지 않거나 반환되지 않을 수도 있습니다. 각 요청마다 새로운 세션으로 끝납니다.
나는이 변경이 어려운 것을 발견했으며, 소스 컨트롤의 여러 커밋 사이에서 몇 시간을주고받으며 어떤 특정 변경 사항이 내 응용 프로그램을 손상 시켰는지 알았습니다.
내 문제는 우리가 web.config 에서이 세트를 가지고 있다는 것입니다.
<httpCookies httpOnlyCookies="true" requireSSL="true" />
이는 비 SSL (기본값)에서 디버깅 할 때 인증 쿠키가 서버로 다시 전송되지 않음을 의미합니다. 이는 서버가 모든 요청에 대해 새 인증 쿠키 (새 세션 포함)를 클라이언트에게 다시 보내는 것을 의미합니다.
수정은 web.config에서 requiresl을 false로 설정하고 web.release.config에서 true로 설정하거나 디버깅하는 동안 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 요청은 서버에서 다른 세션을 발생시킵니다.
필자의 경우 이것은 개발 및 테스트 환경에서 많이 발생했습니다. 성공하지 않고 위의 모든 솔루션을 시도한 후 모든 세션 쿠키를 삭제 하여이 문제를 해결할 수 있음을 발견했습니다. 웹 개발자 확장을 통해이 작업을 매우 쉽게 수행 할 수 있습니다. 나는 주로 테스트 및 개발을 위해 Firefox를 사용하지만 Chrome에서 테스트하는 동안에도 발생했습니다. 이 수정은 Chrome에서도 작동했습니다.
아직 프로덕션 환경에서이 작업을 수행 할 필요가 없었으며 로그인 할 수없는 사용자에 대한 보고서를받지 못했습니다. 세션 쿠키를 안전하게 만든 후에 만 발생하는 것 같습니다. 그들이 안전하지 않은 과거에는 결코 일어나지 않았습니다.
내 경우 에는 외부 응용 프로그램의 게이트웨이에서 리디렉션 한 후 세션 을 수정했기 때문이었습니다. 했기 때문에 해당 페이지 URL의 localhost 대신 IP를 사용했기 때문에 실제로 다른 세션의 다른 웹 사이트로 간주되었습니다.
요약해서 말하자면
IIS Express 대신 IIS에서 호스팅 된 응용 프로그램을 디버깅하고 다양한 페이지에서 컴퓨터 http : // Ip 및 http : // localhost 를 혼합하는 경우 더 많은주의를 기울이십시오 .
내 문제는 Microsoft MediaRoom IPTV 응용 프로그램과 관련이 있습니다. MPF MRML 응용 프로그램은 쿠키를 지원하지 않습니다. web.config에서 쿠키없는 세션을 사용하도록 변경하면 문제가 해결되었습니다.
<sessionState cookieless="true" />
쿠키가없는 ASP.NET : 여기에 관한 오래된 기사가 있습니다.
.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"헤더를 찾을 수 없습니다.
이것은 .NET 4.7.2로 시작하여 변경되었으며 세션 쿠키의 SameSite 속성 때문이었습니다. 자세한 내용은 여기를 참조하십시오 : https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/
기본값은 "Lax"로 바뀌고 깨지기 시작했습니다. 나는 "없음"으로 변경하고 예상대로 작동했습니다.
세션 시간이 매우 짧지 않은지 확인하고 쿠키 기반 세션을 사용중인 경우 세션을 수락하는지 확인하십시오.
FireFox webDeveloperToolbar는 애플리케이션에 설정된 쿠키를 볼 수 있으므로 이와 같은 경우에 유용합니다.
세션 ID 재설정에는 많은 원인이있을 수 있습니다. 그러나 위에서 언급 한 것은 내 문제와 관련이 없습니다. 나중에 참조 할 수 있도록 설명하겠습니다.
필자의 경우 각 요청에서 생성 된 새 세션으로 인해 무한 리디렉션 루프가 발생했습니다. 리디렉션 작업은 OnActionExecuting 이벤트에서 발생합니다.
또한 모든 http 헤더를 지우고 있습니다 ( OnActionExecuting 이벤트 에서도 Response.ClearHeaders 사용) 클라이언트 측의 사이트 캐싱을 방지하기 위해 메서드를 있습니다. 그러나이 방법은 사용자 세션에 대한 정보를 포함한 모든 헤더와 결과적으로 Temp 저장 장치의 모든 데이터 (나중에 프로그램에서 사용하고 있음)를 지 웁니다. 따라서 Session_Start 이벤트에서 새 세션을 설정해도 도움이되지 않았습니다.
내 문제를 해결하기 위해 리디렉션이 발생할 때 헤더를 제거하지 않도록했습니다.
그것이 누군가를 돕기를 바랍니다.
이 문제를 다른 방식으로 만났습니다. 이 속성을 가진 컨트롤러[SessionState(SessionStateBehavior.ReadOnly)]
앱 시작시 원래 세션에서 값을 설정했지만 다른 세션에서 읽었습니다. _layout.cshtml을 통해 세션 값을 추가했습니다 (최상의 아이디어는 아닐 수도 있습니까?)
속성을 제거 할 때 원래 세션 (및 SessionId)이 그대로 유지되기 때문에 분명히 ReadOnly 문제가 발생했습니다. Claudio / Microsoft 솔루션을 사용하여 문제를 해결했습니다.