ฉันมีปัญหาแปลก ๆ กับการใช้การตรวจสอบคุกกี้ของ Owin
เมื่อฉันเริ่มการรับรองความถูกต้องเซิร์ฟเวอร์ IIS ของฉันทำงานได้อย่างสมบูรณ์แบบบน IE / Firefox และ Chrome
ฉันเริ่มทำการทดสอบด้วย Authentication และเข้าสู่ระบบบนแพลตฟอร์มที่แตกต่างกันและฉันพบข้อผิดพลาดแปลก ๆ กรอบ / Owin เป็นระยะ ๆ ไม่ส่งคุกกี้ใด ๆ ไปยังเบราว์เซอร์ ฉันจะพิมพ์ชื่อผู้ใช้และรหัสผ่านที่ถูกต้องรหัสทำงาน แต่ไม่มีการส่งคุกกี้ไปยังเบราว์เซอร์เลย หากฉันรีสตาร์ทเซิร์ฟเวอร์มันจะเริ่มทำงานเมื่อถึงจุดหนึ่งฉันจะลองล็อกอินอีกครั้งและคุกกี้จะหยุดการส่งมอบอีกครั้ง การเหยียบรหัสไม่ทำอะไรเลยและไม่เกิดข้อผิดพลาด
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
AuthenticationType = "ABC",
LoginPath = new PathString("/Account/Login"),
CookiePath = "/",
CookieName = "ABC",
Provider = new CookieAuthenticationProvider
{
OnApplyRedirect = ctx =>
{
if (!IsAjaxRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
}
}
});
และภายในขั้นตอนการเข้าสู่ระบบฉันมีรหัสต่อไปนี้:
IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var authentication = HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("ABC");
identity.AddClaim(new Claim(ClaimTypes.Name, user.Username));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.User_ID.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, role.myRole.ToString()));
authentication.AuthenticationResponseGrant =
new AuthenticationResponseGrant(identity, new AuthenticationProperties()
{
IsPersistent = isPersistent
});
authenticationManager.SignIn(new AuthenticationProperties() {IsPersistent = isPersistent}, identity);
อัปเดต 1:ดูเหมือนว่าสาเหตุหนึ่งของปัญหาคือเมื่อฉันเพิ่มรายการในเซสชันที่ปัญหาเริ่มต้นขึ้น การเพิ่มสิ่งที่เรียบง่ายเช่นSession.Content["ABC"]= 123
ดูเหมือนว่าจะสร้างปัญหา
สิ่งที่ฉันสามารถทำได้มีดังนี้: 1) (Chrome) เมื่อฉันลงชื่อเข้าใช้ฉันจะได้รับ ASP.NET_SessionId + คุกกี้การตรวจสอบสิทธิ์ของฉัน 2) ฉันไปที่หน้าที่ตั้งค่าเซสชันเนื้อหา ... 3) เปิดเบราว์เซอร์ใหม่ (Firefox) และลองเข้าสู่ระบบและไม่ได้รับ ASP.NET_SessionId และไม่ได้รับคุกกี้การตรวจสอบสิทธิ์ 4) ในขณะที่เบราว์เซอร์แรก มี ASP.NET_SessionId มันยังคงทำงานต่อไป นาทีที่ฉันลบคุกกี้นี้มันมีปัญหาเช่นเดียวกับเบราว์เซอร์อื่น ๆ ทั้งหมดที่ฉันใช้กับที่อยู่ IP (10.xxx) และ localhost
อัปเดต 2:บังคับให้สร้างรายการASPNET_SessionId
แรกในหน้าล็อกอินของฉันก่อนทำการตรวจสอบสิทธิ์ด้วย OWIN
1) ก่อนที่ฉันจะรับรองความถูกต้องกับ OWIN ฉันจะสร้างSession.Content
ค่าสุ่มบนหน้าเข้าสู่ระบบของฉันเพื่อเริ่มต้น ASP.NET_SessionId 2) จากนั้นฉันจะตรวจสอบสิทธิ์และสร้างเซสชันเพิ่มเติม 3) เบราว์เซอร์อื่น ๆ
นี่มันแปลกประหลาด ฉันสามารถสรุปได้ว่าสิ่งนี้เกี่ยวข้องกับ ASP และ OWIN โดยคิดว่าพวกเขาอยู่ในโดเมนที่ต่างกันหรืออะไรทำนองนั้น
อัพเดท 3 - พฤติกรรมแปลก ๆ ระหว่างคนทั้งสอง
พฤติกรรมที่แปลกเพิ่มเติมที่ระบุ - การหมดเวลาของ Owin และเซสชัน ASP นั้นแตกต่างกัน สิ่งที่ฉันเห็นคือว่าเซสชัน Owin ของฉันมีชีวิตอยู่ได้นานกว่าเซสชัน ASP ของฉันผ่านกลไกบางอย่าง ดังนั้นเมื่อเข้าสู่ระบบ: 1. ) ฉันมีเซสชั่นรับรองความถูกต้องตามที่ปรุงไว้ 2. ) ฉันตั้งค่าตัวแปรเซสชันไม่กี่
ตัวแปรเซสชันของฉัน (2) "ตาย" ก่อนตัวแปรเซสชันคุกกี้ owin บังคับให้ลงชื่อเข้าใช้อีกครั้งซึ่งทำให้เกิดพฤติกรรมที่ไม่คาดคิดตลอดทั้งแอปพลิเคชันของฉัน (บุคคลนั้นเข้าสู่ระบบ แต่ไม่ได้เข้าสู่ระบบจริงๆ)
อัปเดต 3B
หลังจากการขุดบางครั้งฉันเห็นความคิดเห็นบางอย่างในหน้าเว็บที่ระบุว่า "ฟอร์ม" การหมดเวลาการตรวจสอบสิทธิ์และการหมดเวลาเซสชันต้องตรงกัน ฉันคิดว่าโดยทั่วไปทั้งสองจะซิงค์กัน แต่ด้วยเหตุผลใดก็ตามที่ทั้งสองไม่ตรงกัน
สรุปการแก้ไขปัญหา
1) สร้างเซสชันก่อนการรับรองความถูกต้องเสมอ สร้างเซสชันโดยทั่วไปเมื่อคุณเริ่มแอปพลิเคชันSession["Workaround"] = 0;
2) [ทดลอง] หากคุณยืนยันคุกกี้ตรวจสอบให้แน่ใจว่าการหมดเวลา / ความยาวของ OWIN ของคุณนั้นยาวกว่า sessionTimeout ของคุณใน web.config (ในการทดสอบ)