FormsAuthentication.SignOut () ไม่ออกจากระบบผู้ใช้


143

ทุบหัวของฉันกับเรื่องนี้นานเกินไป ฉันจะป้องกันผู้ใช้จากการเรียกดูหน้าเว็บไซต์หลังจากที่พวกเขาออกจากระบบโดยใช้ FormsAuthentication.SignOut ได้อย่างไร ฉันคาดหวังว่าสิ่งนี้จะทำ:

FormsAuthentication.SignOut();
Session.Abandon();
FormsAuthentication.RedirectToLoginPage();

แต่มันก็ไม่ได้ หากฉันพิมพ์ URL โดยตรงฉันยังคงสามารถเรียกดูหน้านั้นได้ ฉันไม่ได้ใช้การรักษาความปลอดภัยของคุณเองในขณะที่ดังนั้นฉันลืมว่าทำไมมันไม่ทำงาน


รหัสนั้นดีตามที่เป็น ... การคลิกกลับไปที่เบราว์เซอร์ไม่ได้กลับไปที่หน้าบนเซิร์ฟเวอร์อีกครั้งเพียงแค่โหลดหน้าเว็บในเวอร์ชันแคชท้องถิ่น โซลูชันทั้งหมดด้านล่างดูเหมือนจะเพิกเฉยต่อความจริงนั้นและไม่ได้ทำอะไรมากกว่าที่คุณทำที่นี่ ในระยะสั้น ... ไม่มีคำตอบสำหรับคำถามนี้ที่จะแก้ปัญหาผู้ใช้ที่ดูแคชของพวกเขาเป็นวันที่ฉันไม่เชื่อว่ามีวิธีการล้างแคชในการพูด ... js หรือด้วยคำสั่งด้านเซิร์ฟเวอร์
สงคราม

คำตอบนี้นำเสนอวิธีการตรวจสอบโดยเฉพาะอย่างยิ่งหากไซต์ของคุณล้มเหลวในการทดสอบ PEN: stackoverflow.com/questions/31565632/…
Tyler S. Loeper

คำตอบ:


211

ผู้ใช้ยังคงสามารถเรียกดูเว็บไซต์ของคุณได้เนื่องจากคุกกี้จะไม่ถูกล้างออกเมื่อคุณโทรFormsAuthentication.SignOut()และพวกเขาจะได้รับการรับรองในทุกคำขอใหม่ ในเอกสารของ MS มีการกล่าวว่าคุกกี้นั้นจะถูกล้าง แต่จะไม่เกิดปัญหา มันเหมือนกันกับSession.Abandon()คุกกี้ยังคงมี

คุณควรเปลี่ยนรหัสของคุณเป็น:

FormsAuthentication.SignOut();
Session.Abandon();

// clear authentication cookie
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
cookie1.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie1);

// clear session cookie (not necessary for your current problem but i would recommend you do it anyway)
SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");
HttpCookie cookie2 = new HttpCookie(sessionStateSection.CookieName, "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);

FormsAuthentication.RedirectToLoginPage();

HttpCookieอยู่ในSystem.Webเนมสเปซ MSDN อ้างอิง


18
มันใช้งานได้สำหรับฉัน อย่างไรก็ตามควรทราบว่าหากมีการตั้งค่าคุณสมบัติโดเมนบนคุกกี้ FormsAuthentication เมื่อลงชื่อเข้าใช้จะต้องมีการตั้งค่าเมื่อหมดอายุคุกกี้เมื่อคุณออกจากระบบ
Phil Hale

8
อย่าลืมcookie1.HttpOnly = true
Dmitry Zaets

6
ดูเหมือนว่าจะเป็นทางออกที่ดีกว่าสำหรับฉัน: Response.Cookies [FormsAuthentication.FormsCookieName] .Expires = DateTime.Now.AddDays (-1);
แรนดี้เอช.

7
@RandyH การแทนที่คุกกี้ FormsAuthentication ที่มีอยู่ด้วยคุกกี้ว่างใหม่ช่วยให้มั่นใจได้ว่าแม้ว่าไคลเอนต์จะหมุนกลับนาฬิการะบบของพวกเขาพวกเขาจะยังไม่สามารถเรียกคืนข้อมูลผู้ใช้ใด ๆ จากคุกกี้
Tri Q Tran

9
บางคนสามารถรวมความคิดเห็นเหล่านี้ทั้งหมดไว้ในคำตอบได้หรือไม่?
David

22

การใช้การโพสต์สองรายการข้างต้นโดย x64igor และ Phil Haselden แก้ไขปัญหานี้:

1. x64igor ให้ตัวอย่างในการล็อกเอาต์:

  • ก่อนอื่นคุณต้องล้างคุกกี้การรับรองความถูกต้องและคุกกี้เซสชันโดยส่งกลับคุกกี้เปล่าในการตอบกลับออกจากระบบ

    public ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        Session.Clear();  // This may not be needed -- but can't hurt
        Session.Abandon();
    
        // Clear authentication cookie
        HttpCookie rFormsCookie = new HttpCookie( FormsAuthentication.FormsCookieName, "" );
        rFormsCookie.Expires = DateTime.Now.AddYears( -1 );
        Response.Cookies.Add( rFormsCookie );
    
        // Clear session cookie 
        HttpCookie rSessionCookie = new HttpCookie( "ASP.NET_SessionId", "" );
        rSessionCookie.Expires = DateTime.Now.AddYears( -1 );
        Response.Cookies.Add( rSessionCookie );

2. Phil Haselden ยกตัวอย่างข้างต้นถึงวิธีป้องกันการแคชหลังจากออกจากระบบ:

  • คุณจำเป็นต้องโมฆะแคชบนไคลเอ็นต์ผ่านการตอบสนอง

        // Invalidate the Cache on the Client Side
        Response.Cache.SetCacheability( HttpCacheability.NoCache );
        Response.Cache.SetNoStore();
    
        // Redirect to the Home Page (that should be intercepted and redirected to the Login Page first)
        return RedirectToAction( "Index", "Home" ); 
    }

1
เสียทั้งวันในการทำงานเพื่อแก้ไขปัญหานี้ เมื่อเข้าสู่ระบบในปุ่มออกจากระบบเริ่มที่จะเรียกการกระทำที่ไม่ถูกต้องในตัวควบคุม (เข้าสู่ระบบไม่ได้ออกจากระบบ) ขอบคุณการแก้ไขปัญหา สภาพแวดล้อมการพัฒนา: ASP.NET 4.51 MVC 5.1
Ako

1
คำตอบที่ดี! ข้อเสนอแนะในฮัมเบิล: ใช้สมมติฐานสำหรับคุกกี้เซสชั่นล้างx64igorSessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState"); HttpCookie sessionCookie = new HttpCookie(sessionStateSection.CookieName, "");ใช้: "ASP.NET_SessionId"โดยทั่วไปชื่อคุกกี้เซสชั่นที่ไม่ได้เป็น
seebiscuit

20

ฟังดูเหมือนว่าคุณไม่มีส่วนการอนุมัติการตั้งค่าการตั้งค่าภายในอย่างถูกต้อง ดูตัวอย่างด้านล่าง

<authentication mode="Forms">
  <forms name="MyCookie" loginUrl="Login.aspx" protection="All" timeout="90" slidingExpiration="true"></forms>
</authentication>
<authorization>
  <deny users="?" />
</authorization>

นี่เป็นวิธีที่ง่ายกว่ามากฉันจะทำเครื่องหมายว่านี่เป็นคำตอบ เมื่อฉันได้รับโค้ดเวอร์ชันหนึ่งที่ทำงานบนเซิร์ฟเวอร์ที่แตกต่างกันในอันที่หนึ่งฉันไม่จำเป็นต้องตั้งค่าคุณสมบัติเพิ่มเติมที่คุณเพิ่มที่นี่และที่อื่น ๆ ที่ฉันทำ ดังนั้นรหัสการแก้ไขไม่ควรเป็นวิธีแก้ไขที่ถูกต้อง
Vladimir Bozic

โดยค่าเริ่มต้น slidingExpiration ถูกตั้งค่าเป็นจริง ( msdn.microsoft.com/library/1d3t3c61(v=vs.100).aspx ) และสิ่งนี้จะส่งผลให้คุกกี้ไม่ถูกต้องหลังจาก x นาทีตามเวลาที่กำหนดไว้และไม่ใช่เมื่อผู้ใช้ออกจากระบบผ่าน SignOut () ดังนั้นสิ่งนี้จะไม่ส่งผลให้เกิดพฤติกรรมที่ต้องการในการออกจากระบบโดยใช้ FormsAuthentication โปรดแก้ไขฉันหากฉันผิด
OlafW

12

กุญแจสำคัญในที่นี้คือคุณพูดว่า "ถ้าฉันพิมพ์ URL โดยตรง ... "

โดยค่าเริ่มต้นภายใต้การตรวจสอบรูปแบบเบราว์เซอร์แคชหน้าสำหรับผู้ใช้ ดังนั้นการเลือก URL โดยตรงจากช่องดรอปดาวน์ของที่อยู่เบราว์เซอร์หรือพิมพ์ลงไปอาจรับหน้าเว็บจากแคชของเบราว์เซอร์และอย่ากลับไปที่เซิร์ฟเวอร์เพื่อตรวจสอบการอนุญาต / การอนุญาต วิธีแก้ไขปัญหานี้คือเพื่อป้องกันการแคชฝั่งไคลเอ็นต์ในเหตุการณ์ Page_Load ของแต่ละหน้าหรือใน OnLoad () ของหน้าฐานของคุณ:

Response.Cache.SetCacheability(HttpCacheability.NoCache);

คุณอาจต้องการโทร:

Response.Cache.SetNoStore();

11

ฉันเคยต่อสู้กับเรื่องนี้มาก่อนเช่นกัน

นี่คือการเปรียบเทียบสิ่งที่ดูเหมือนจะเกิดขึ้น ... ผู้เข้าชมรายใหม่ Joe มาที่เว็บไซต์และเข้าสู่ระบบผ่านหน้าเข้าสู่ระบบโดยใช้ FormsAuthentication ASP.NET สร้างรหัสประจำตัวใหม่ให้กับ Joe และมอบคุกกี้ให้เขา คุกกี้นั้นเป็นเหมือนกุญแจบ้านและตราบใดที่โจกลับมาพร้อมกุญแจเขาก็สามารถเปิดล็อคได้ ผู้เข้าชมแต่ละคนจะได้รับคีย์ใหม่และล็อคใหม่ที่จะใช้

เมื่อFormsAuthentication.SignOut()ถูกเรียกระบบจะบอกให้ Joe เสียกุญแจ โดยปกติแล้วงานนี้เนื่องจากโจไม่มีกุญแจอีกต่อไปเขาจึงไม่สามารถเข้าไปได้

แต่ถ้าโจเคยกลับมาและไม่ได้ว่ากุญแจที่หายไปเขาเป็นให้กลับมาอยู่ใน!

จากสิ่งที่ฉันสามารถบอกได้ไม่มีทางที่จะบอก ASP.NET ให้เปลี่ยนล็อคประตู!

วิธีที่ฉันสามารถมีชีวิตอยู่กับสิ่งนี้คือการจดจำชื่อของโจในตัวแปรเซสชัน เมื่อเขาออกจากระบบฉันละทิ้งเซสชันดังนั้นฉันจึงไม่มีชื่อของเขาอีกต่อไป ในภายหลังเพื่อตรวจสอบว่าเขาได้รับอนุญาตหรือไม่ฉันเพียงเปรียบเทียบ Identity.Name ของเขากับสิ่งที่เซสชันปัจจุบันมีและหากพวกเขาไม่ตรงกันเขาไม่ใช่ผู้เข้าชมที่ถูกต้อง

ในระยะสั้นสำหรับเว็บไซต์อย่าพึ่งพาUser.Identity.IsAuthenticatedโดยไม่ตรวจสอบตัวแปรเซสชันของคุณด้วย!


8
+ 1 ฉันคิดว่านี่เรียกว่า 'Cookie replay attack' มีบทความเกี่ยวกับข้อ จำกัด ของ FormsAuthentication.SignOut: support.microsoft.com/kb/900111
Dmitry

3
สำหรับทุกคนที่ต้องการติดตามลิงก์ด้านบนมันตายไปแล้ว คุณสามารถลองใช้ WaybackMachine เพื่อรับสำเนาของหน้านี้ได้ที่นี่ แต่ IMMEDIATELY จะพยายามเปลี่ยนเส้นทางผู้ใช้ทันที web.archive.org/web/20171128133421/https://…
killa-byte

7

หลังจากการค้นหาจำนวนมากในที่สุดก็ใช้งานได้สำหรับฉัน ฉันหวังว่ามันจะช่วย

public ActionResult LogOff()
{
    AuthenticationManager.SignOut();
    HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty), null);
    return RedirectToAction("Index", "Home");
}

<li class="page-scroll">@Html.ActionLink("Log off", "LogOff", "Account")</li>

ฉันพัฒนาเว็บแอพพลิเคชั่นมาหลายปีใน PHP ดังนั้นฉันใหม่กับ MVC ... ฉันยอมรับว่าฉันรักมัน แต่ใครจะคิดว่าบางสิ่งบางอย่างง่าย ๆ เพราะการตัดคนออกจะเป็นเรื่องยาก? ฉันลองใช้สคริปต์อื่น ๆ ในหน้านี้ทุกบรรทัดและนี่เป็นสคริปต์เดียวที่ทำงานได้ ขอบคุณสำหรับการโพสต์!
Anthony Griggs

6

มันใช้งานได้สำหรับฉัน

public virtual ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        foreach (var cookie in Request.Cookies.AllKeys)
        {
            Request.Cookies.Remove(cookie);
        }
        foreach (var cookie in Response.Cookies.AllKeys)
        {
            Response.Cookies.Remove(cookie);
        }
        return RedirectToAction(MVC.Home.Index());
    }

3

รหัสที่คุณโพสต์ดูเหมือนว่าควรลบโทเค็นการรับรองความถูกต้องของฟอร์มอย่างถูกต้องดังนั้นจึงเป็นไปได้ว่าโฟลเดอร์ / เพจที่เป็นปัญหาไม่ได้รับการปกป้องจริง ๆ

คุณยืนยันว่าหน้าไม่สามารถเข้าถึงได้ก่อนที่การเข้าสู่ระบบจะเกิดขึ้น?

คุณสามารถโพสต์การตั้งค่า web.config และรหัสเข้าสู่ระบบที่คุณใช้อยู่ได้หรือไม่?


3

ฉันได้เขียนคลาสพื้นฐานสำหรับทุกหน้าของฉันและฉันมาถึงปัญหาเดียวกัน ฉันมีรหัสดังต่อไปนี้และมันไม่ทำงาน โดยการติดตามการควบคุมผ่านจากคำสั่ง RedirectToLoginPage () ไปยังบรรทัดถัดไปโดยไม่ต้องถูกเปลี่ยนเส้นทาง

if (_requiresAuthentication)
{
    if (!User.Identity.IsAuthenticated)
        FormsAuthentication.RedirectToLoginPage();

    // check authorization for restricted pages only
    if (_isRestrictedPage) AuthorizePageAndButtons();
}

ฉันพบว่ามีสองวิธี อาจแก้ไข FormsAuthentication.RedirectToLoginPage (); เป็น

if (!User.Identity.IsAuthenticated)
    Response.Redirect(FormsAuthentication.LoginUrl);

หรือเพื่อแก้ไข web.config โดยการเพิ่ม

<authorization>
  <deny users="?" />
</authorization>

ในกรณีที่สองในขณะที่การสืบค้นกลับการควบคุมไม่ไปถึงหน้าที่ร้องขอ มันถูกเปลี่ยนเส้นทางทันทีไปยัง URL การเข้าสู่ระบบก่อนที่จะกดจุดพัก ดังนั้นวิธี SignOut () ไม่ใช่ปัญหาวิธีการเปลี่ยนเส้นทางเป็นวิธีหนึ่ง

ฉันหวังว่าอาจช่วยใครบางคน

ความนับถือ


2
นอกจากนี้คุณยังสามารถโทรไปยัง Response.End () หลังจากเรียก FormsAuthentication.RedirectToLoginPage ()
Murki

ฉันคิดว่ามันมีการสื่อสารที่ผิดพลาดเล็กน้อยในส่วนของ MS คุณต้องล็อคคนถ้าคุณต้องการให้พวกเขากลับไปที่หน้าเข้าสู่ระบบ มิฉะนั้นกรอบงานจะช่วยให้คุณเข้าถึงได้อย่างสนุกสนาน ดังนั้นคุณต้องบอกว่าโซลูชัน # 2 ในโพสต์นี้
Josh Robinson

3

ฉันลองคำแนะนำที่นี่และในขณะที่ฉันสามารถใช้ปุ่มย้อนกลับของเบราว์เซอร์เมื่อฉันคลิกที่เมนูการเลือกโทเค็น [อนุญาต] สำหรับ [ActionResult] นั้นก็ส่งฉันกลับไปที่หน้าจอเข้าสู่ระบบ

นี่คือรหัสออกจากระบบของฉัน:

        FormsAuthentication.SignOut();
        Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
        Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
        HttpCookie cookie = HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (cookie != null)
        {
            cookie.Expires = DateTime.Now.AddDays(-1);
            Response.Cookies.Add(cookie);
        }

แม้ว่าฟังก์ชั่นย้อนกลับบนเบราว์เซอร์จะนำฉันกลับมาและแสดงเมนูที่ปลอดภัย (ฉันยังคงทำงานต่อไป) ฉันไม่สามารถทำสิ่งใดที่ปลอดภัยในแอปได้

หวังว่านี่จะช่วยได้


ขอบคุณ นี่เป็นวิธีแก้ปัญหาที่เหมาะกับฉัน (ไม่จำเป็นต้อง<deny users="?" />อยู่ใน web.config)
Alexei

3

ฉันได้ลองคำตอบส่วนใหญ่ในหัวข้อนี้ไม่โชค จบลงด้วยสิ่งนี้:

protected void btnLogout_Click(object sender, EventArgs e)
{
    FormsAuthentication.Initialize();
    var fat = new FormsAuthenticationTicket(1, "", DateTime.Now, DateTime.Now.AddMinutes(-30), false, string.Empty, FormsAuthentication.FormsCookiePath);
    Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat)));
    FormsAuthentication.RedirectToLoginPage();
}

พบได้ที่นี่: http://forums.asp.net/t/1306526.aspx/1


3

คำตอบนี้เป็นทางเทคนิคเหมือนกับ Khosro.Pakmanesh ฉันโพสต์มันเพื่อชี้แจงว่าคำตอบของเขาแตกต่างจากคำตอบอื่น ๆ ในกระทู้นี้และในกรณีที่สามารถใช้งานได้

โดยทั่วไปเพื่อล้างเซสชั่นผู้ใช้ทำ

HttpContext.Session.Abandon();
FormsAuthentication.SignOut();

จะออกจากระบบผู้ใช้อย่างมีประสิทธิภาพ อย่างไรก็ตามหากอยู่ในคำขอเดียวกันคุณต้องตรวจสอบRequest.isAuthenticated(เช่นบ่อยครั้งที่อาจเกิดขึ้นในตัวกรองการอนุญาต) แล้วคุณจะพบว่า

Request.isAuthenticated == true

แม้ _after ที่คุณทำและHttpContext.Session.Abandon()FormsAuthentication.SignOut()

สิ่งเดียวที่ใช้ได้คือทำ

AuthenticationManager.SignOut();
HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty), null);

ที่กำหนดRequest.isAuthenticated = falseไว้อย่างมีประสิทธิภาพ


2

นี้เริ่มเกิดขึ้นกับผมเมื่อผมตั้งค่าการตรวจสอบ> รูปแบบ> คุณสมบัติเส้นทางWeb.configใน การลบที่แก้ไขปัญหาได้และFormsAuthentication.SignOut();คุกกี้จะถูกลบอีกครั้งอย่างง่ายดาย


1

อาจเป็นไปได้ว่าคุณกำลังลงชื่อเข้าใช้จากโดเมนย่อยหนึ่งโดเมน (sub1.domain.com) แล้วลองล็อกเอาต์จากโดเมนย่อยอื่น (www.domain.com)


1

ฉันเพิ่งมีปัญหาเดียวกันที่ SignOut () ดูเหมือนจะล้มเหลวในการลบตั๋วอย่างถูกต้อง แต่เฉพาะในกรณีเฉพาะที่บางตรรกะอื่น ๆ ทำให้เกิดการเปลี่ยนเส้นทาง หลังจากฉันลบการเปลี่ยนเส้นทางครั้งที่สองนี้ (แทนที่ด้วยข้อความแสดงข้อผิดพลาด) ปัญหาก็หายไป

ปัญหาต้องได้รับการที่หน้าเปลี่ยนเส้นทางในเวลาที่ไม่ถูกต้องจึงไม่ก่อให้เกิดการตรวจสอบ


1

ฉันมีปัญหาที่คล้ายกันในขณะนี้และฉันเชื่อว่าปัญหาในกรณีของฉันเช่นเดียวกับโปสเตอร์ต้นฉบับเป็นเพราะการเปลี่ยนเส้นทาง ตามค่าเริ่มต้น Response.Redirect จะทำให้เกิดข้อยกเว้นซึ่งจะทำให้เกิดฟองขึ้นมาทันทีจนกว่าจะถูกดักจับและดำเนินการเปลี่ยนเส้นทางทันทีฉันเดาว่านี่จะเป็นการป้องกันไม่ให้มีการส่งต่อคุกกี้ไปยังลูกค้า หากคุณแก้ไขรหัสเพื่อใช้งาน:

Response.Redirect("url", false);

สิ่งนี้จะป้องกันข้อยกเว้นและดูเหมือนว่าจะอนุญาตให้ส่งคุกกี้กลับไปยังลูกค้าได้อย่างถูกต้อง


1

เพียงลองส่งตัวแปรเซสชันเมื่อคุณกดเข้าสู่ระบบและในหน้าต้อนรับก่อนอื่นให้ตรวจสอบว่าเซสชันนั้นว่างเปล่าเช่นนี้ในการโหลดหน้าเว็บหรือในกิจกรรมเริ่มต้น:

if(Session["UserID"] == null || Session["UserID"] == "")
{
    Response.Redirect("Login.aspx");
}

1

สำหรับฉันแล้วแนวทางต่อไปนี้ใช้ได้ผล ฉันคิดว่าหากมีข้อผิดพลาดใด ๆ หลังจากคำสั่ง "FormsAuthentication.SignOut ()" SingOut ไม่ทำงาน

public ActionResult SignOut()
    {
        if (Request.IsAuthenticated)
        {
            FormsAuthentication.SignOut();

            return Redirect("~/");
        }
        return View();
     }

0

คุณกำลังทดสอบ / ดูพฤติกรรมนี้โดยใช้ IE หรือไม่ เป็นไปได้ว่า IE กำลังแสดงหน้าเว็บเหล่านั้นจากแคช เป็นการยากที่จะทำให้ IE ลบแคชของมันได้อย่างฉาวโฉ่หลายต่อหลายครั้งแม้หลังจากที่คุณออกจากระบบพิมพ์ url ของหนึ่งในหน้า "ปลอดภัย" จะแสดงเนื้อหาที่แคชไว้ก่อนหน้านี้

(ฉันเคยเห็นพฤติกรรมนี้แม้ว่าคุณจะลงชื่อเข้าใช้ในฐานะผู้ใช้คนอื่นและ IE ก็แสดงแถบ "ยินดีต้อนรับ" ที่ด้านบนของหน้าเว็บของคุณด้วยชื่อผู้ใช้ของผู้ใช้เก่า ๆ ทุกวันนี้การโหลดซ้ำจะอัปเดต อาจเป็นปัญหาการแคชได้)


0

ทำ Session.abandon () และการทำลายคุกกี้ทำงานได้ดีทีเดียว ฉันใช้ mvc3 และดูเหมือนว่าปัญหาจะเกิดขึ้นหากคุณไปที่หน้าที่ได้รับการป้องกันออกจากระบบและผ่านประวัติเบราว์เซอร์ของคุณ ไม่ใช่เรื่องใหญ่ แต่ก็ยังน่ารำคาญ

พยายามที่จะผ่านการเชื่อมโยงบนเว็บแอปของฉันทำงานอย่างถูกต้อง

การตั้งค่าเป็นไม่ใช้การแคชของเบราว์เซอร์อาจเป็นวิธีที่ควรดำเนินการ


0

สำหรับ MVC สิ่งนี้ใช้ได้กับฉัน:

        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();
            return Redirect(FormsAuthentication.GetRedirectUrl(User.Identity.Name, true));
        }

0

ฉันต้องการเพิ่มข้อมูลเพื่อช่วยให้เข้าใจปัญหา การรับรองความถูกต้องของฟอร์มอนุญาตให้เก็บข้อมูลผู้ใช้ในคุกกี้หรือในสตริงการสืบค้นของ URL วิธีที่ไซต์ของคุณรองรับสามารถกำหนดค่าในไฟล์ web.config

ตามที่ Microsoft :

วิธีการลงชื่อออกจากระบบเอาข้อมูลตั๋วแบบฟอร์มการตรวจสอบจากคุกกี้หรือ URL ตัวอย่างเช่นถ้า CookiesSupported เป็นเท็จ

ในขณะเดียวกันพวกเขาก็พูดว่า :

หนึ่งในค่า HttpCookieMode ที่ระบุว่ามีการกำหนดค่าแอปพลิเคชันสำหรับการตรวจสอบความถูกต้องของรูปแบบที่ไม่ใช้การปรุงหรือไม่ เริ่มต้นคือ UseDeviceProfile

สุดท้ายเกี่ยวกับ UseDeviceProfile พวกเขาพูดว่า :

ถ้าคุณสมบัติ CookieMode ถูกตั้งค่าให้ UseDeviceProfile ที่ CookiesSupported ทรัพย์สินจะกลับจริงถ้าเบราว์เซอร์สำหรับ คำขอปัจจุบันสนับสนุนทั้งคุกกี้และเปลี่ยนเส้นทางกับคุกกี้ ; มิฉะนั้นคุณสมบัติของ CookiesSupported จะคืนค่าเป็นเท็จ

การประกอบทั้งหมดเข้าด้วยกันขึ้นอยู่กับเบราว์เซอร์ของผู้ใช้การกำหนดค่าเริ่มต้นอาจส่งผลให้มีการสนับสนุนคุกกี้เป็นจริงซึ่งหมายความว่าวิธี SignOut ไม่ได้ล้างตั๋วจากคุกกี้ ดูเหมือนว่าจะตอบโต้ได้ง่ายและฉันไม่รู้ว่าทำไมมันจึงทำงานเช่นนี้ฉันคาดหวังว่า SignOut จะออกจากระบบผู้ใช้ไม่ว่าในกรณีใด ๆ

วิธีหนึ่งในการทำให้ SignOut ทำงานได้ด้วยตัวเองคือเปลี่ยนโหมดคุกกี้เป็น "UseCookies" (ต้องใช้คุกกี้) ในไฟล์ web.config:

<authentication mode="Forms">
  <forms loginUrl="~/Account/SignIn" cookieless="UseCookies"/>
</authentication>

จากการทดสอบของฉันการทำสิ่งนี้ทำให้ SignOut ทำงานด้วยตัวเองในราคาที่คุณต้องมีเพื่อให้คุกกี้ทำงานได้อย่างถูกต้อง


ฉันคิดว่าคุณกำลังอ่านผิดที่ เกี่ยวกับ SignOut () ฉันค่อนข้างแน่ใจว่าสิ่งที่พวกเขาหมายถึงคือมันจะถูกล้างออกจาก URL หาก CookiesSupported เป็นเท็จมิฉะนั้นจากคุกกี้ นั่นคือพวกเขาควรจะเขียนว่า "วิธี SignOut ลบข้อมูลตั๋วแบบฟอร์มการรับรองความถูกต้องจากคุกกี้หรือหาก CookiesSupported เป็นเท็จจาก URL"
Oskar Berggren

-1

โปรดทราบว่า WIF ปฏิเสธที่จะบอกเบราว์เซอร์ล้างคุกกี้ถ้าข้อความ wsignoutcleanup จากเอสทีไม่ตรงกับ URL ที่มีชื่อของแอพลิเคชันจาก IIS และผมหมายถึงกรณี SENSITIVE WIF ตอบกลับด้วยการตรวจสอบ OK สีเขียว แต่จะไม่ส่งคำสั่งเพื่อลบคุกกี้ไปยังเบราว์เซอร์

ดังนั้นคุณจะต้องใส่ใจกับความอ่อนไหวของ URL ของคุณ

ตัวอย่างเช่นเซิร์ฟเวอร์ ThinkTecture Identity จะบันทึก URL ของ RPs ที่เข้าชมในคุกกี้เดียว แต่จะทำให้ตัวพิมพ์เล็กทั้งหมด WIF จะได้รับข้อความ wsignoutcleanup เป็นตัวพิมพ์เล็กและจะเปรียบเทียบกับชื่อแอปพลิเคชันใน IIS หากไม่ตรงกันจะไม่ลบคุกกี้ แต่จะรายงานว่าตกลงกับเบราว์เซอร์ ดังนั้นสำหรับ Identity Server นี้ฉันจำเป็นต้องเขียน URL ทั้งหมดใน web.config และชื่อแอปพลิเคชันทั้งหมดใน IIS ในกรณีที่ต่ำกว่าเพื่อหลีกเลี่ยงปัญหาดังกล่าว

และอย่าลืมอนุญาตคุกกี้ของบุคคลที่สามในเบราว์เซอร์หากคุณมีแอปพลิเคชันนอกโดเมนย่อยของ STS มิฉะนั้นเบราว์เซอร์จะไม่ลบคุกกี้แม้ว่า WIF จะบอกเขาเช่นนั้น


1
WIF? เอสที? ThinkTecture Identity Server หรือไม่ ทุกสิ่งเหล่านี้คืออะไรและพวกเขาเกี่ยวข้องกับคำถามนี้อย่างไร
Oskar Berggren
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.