โทเค็นต่อต้านการปลอมแปลงมีไว้สำหรับผู้ใช้“” แต่ผู้ใช้ปัจจุบันคือ“ ชื่อผู้ใช้”


130

ฉันกำลังสร้างแอปพลิเคชันหน้าเดียวและประสบปัญหาเกี่ยวกับโทเค็นต่อต้านการปลอมแปลง

ฉันรู้ว่าทำไมปัญหาจึงเกิดขึ้นฉันไม่รู้วิธีแก้ไข

ฉันได้รับข้อผิดพลาดเมื่อเกิดเหตุการณ์ต่อไปนี้:

  1. ผู้ใช้ที่ไม่ได้เข้าสู่ระบบจะโหลดกล่องโต้ตอบ (พร้อมกับโทเค็นต่อต้านการปลอมแปลงที่สร้างขึ้น)
  2. ผู้ใช้ปิดกล่องโต้ตอบ
  3. ผู้ใช้เข้าสู่ระบบ
  4. ผู้ใช้เปิดกล่องโต้ตอบเดียวกัน
  5. ผู้ใช้ส่งแบบฟอร์มในกล่องโต้ตอบ

โทเค็นต่อต้านการปลอมแปลงมีไว้สำหรับผู้ใช้ "" แต่ผู้ใช้ปัจจุบันคือ "ชื่อผู้ใช้"

สาเหตุที่เกิดขึ้นเนื่องจากแอปพลิเคชันของฉันเป็นแบบหน้าเดียว 100% และเมื่อผู้ใช้เข้าสู่ระบบผ่านการโพสต์ ajax สำเร็จ/Account/JsonLoginฉันก็เพียงแค่เปลี่ยนมุมมองปัจจุบันด้วย "มุมมองที่ได้รับการรับรองความถูกต้อง" ที่ส่งคืนจากเซิร์ฟเวอร์ แต่อย่าโหลดซ้ำ หน้า.

ฉันรู้ว่านี่เป็นสาเหตุเพราะถ้าฉันโหลดหน้าซ้ำระหว่างขั้นตอนที่ 3 และ 4 อย่างง่ายจะไม่มีข้อผิดพลาด

ดังนั้นดูเหมือนว่า@Html.AntiForgeryToken()ในฟอร์มที่โหลดจะยังคงส่งคืนโทเค็นสำหรับผู้ใช้เก่าจนกว่าเพจจะโหลดซ้ำ

ฉัน@Html.AntiForgeryToken()จะเปลี่ยนเพื่อส่งคืนโทเค็นสำหรับผู้ใช้ใหม่ที่ได้รับการรับรองความถูกต้องได้อย่างไร

ฉันฉีดใหม่GenericalPrincipalด้วยการกำหนดเองIIdentityทุกApplication_AuthenticateRequestครั้งที่@Html.AntiForgeryToken()ถูกเรียกว่าHttpContext.Current.User.Identityอันที่จริงแล้ว Identity ที่กำหนดเองของฉันพร้อมIsAuthenticatedคุณสมบัติถูกตั้งค่าเป็น true และ@Html.AntiForgeryTokenยังดูเหมือนว่าจะแสดงโทเค็นสำหรับผู้ใช้เก่าเว้นแต่ฉันจะโหลดหน้าซ้ำ


คุณสามารถตรวจสอบได้จริงหรือไม่ว่ามีการเรียกรหัส @ Html.AntiForgeryToken โดยไม่ต้องโหลดซ้ำ
Kyle C

แน่นอนว่าฉันสามารถหยุดที่นั่นเพื่อตรวจสอบ HttpContext.Current.User object อย่างที่ฉันพูดถึง
รัฐสภา

2
โปรดดูที่: stackoverflow.com/a/19471680/193634
Rosdi Kasim

@ รัฐสภาคุณช่วยบอกได้ไหมว่าคุณเลือกตัวเลือกใดในคำตอบด้านล่าง
Siddharth Pandey

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

คำตอบ:


170

สิ่งนี้เกิดขึ้นเนื่องจากโทเค็นต่อต้านการปลอมแปลงฝังชื่อผู้ใช้ของผู้ใช้เป็นส่วนหนึ่งของโทเค็นที่เข้ารหัสเพื่อการตรวจสอบที่ดีขึ้น เมื่อคุณโทรหา@Html.AntiForgeryToken()ผู้ใช้ครั้งแรกจะไม่ได้เข้าสู่ระบบดังนั้นโทเค็นจะมีสตริงว่างสำหรับชื่อผู้ใช้หลังจากที่ผู้ใช้เข้าสู่ระบบหากคุณไม่แทนที่โทเค็นต่อต้านการปลอมแปลงจะไม่ผ่านการตรวจสอบความถูกต้องเนื่องจากโทเค็นเริ่มต้นมีไว้สำหรับ ผู้ใช้ที่ไม่ระบุชื่อและตอนนี้เรามีผู้ใช้ที่ได้รับการรับรองความถูกต้องด้วยชื่อผู้ใช้ที่รู้จัก

คุณมีทางเลือกในการแก้ปัญหานี้:

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

  2. มีมุมมองบางส่วนด้วยความยุติธรรม@Html.AntiForgeryToken()และทันทีหลังจากเข้าสู่ระบบทำคำขอ AJAX อื่นและแทนที่โทเค็นต่อต้านการปลอมแปลงที่มีอยู่ของคุณด้วยการตอบสนองของคำขอ

  3. เพียงปิดการใช้งานการตรวจสอบข้อมูลประจำตัวการตรวจสอบการต่อต้านการปลอมแปลง เพิ่มสิ่งต่อไปนี้ในเมธอดApplication_Startของคุณ: AntiForgeryConfig.SuppressIdentityHeuristicChecks = true.


21
@ รัฐสภา: คุณยอมรับคำตอบนี้คุณช่วยบอกเราได้ไหมว่าคุณเลือกตัวเลือกใด
R.Schreurs

9
+1 สำหรับตัวเลือกที่ดีและเรียบง่าย 3. การล็อกเอาต์ตามกำหนดเวลาโดยผู้ให้บริการ OAuth ทำให้เกิดปัญหานี้เช่นกัน
Gone Coding

18
ตัวเลือกที่ 3 ไม่ได้ผลสำหรับฉัน ขณะออกจากระบบฉันเปิดสองหน้าต่างในหน้าเข้าสู่ระบบ ลงชื่อเข้าใช้เป็นผู้ใช้หนึ่งคนในหน้าต่างเดียวจากนั้นล็อกอินเป็นผู้ใช้อื่นในอีกหน้าต่างหนึ่งและได้รับข้อผิดพลาดเดียวกัน
McGaz

5
น่าเสียดายที่ฉันไม่สามารถหาวิธีแก้ปัญหาที่ดีได้ ฉันลบโทเค็นออกจากหน้าเข้าสู่ระบบ ฉันยังคงรวมไว้ในโพสต์หลังจากเข้าสู่ระบบ
McGaz

7
ตัวเลือกที่ 3 ไม่ได้ผลสำหรับฉันเช่นกัน ยังคงได้รับข้อผิดพลาดเดิม
Joao Leme

25

ในการแก้ไขข้อผิดพลาดคุณต้องวางOutputCacheคำอธิบายประกอบข้อมูลในActionResultหน้ารับการเข้าสู่ระบบเป็น:

[OutputCache(NoStore=true, Duration = 0, VaryByParam= "None")] 
public ActionResult Login(string returnUrl)

3
สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้เป็นเรื่องที่สมเหตุสมผล ขอบคุณ!
Prime03

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

กรณีของฉัน: 1. ผู้ใช้เข้าสู่ระบบ () และเข้าสู่หน้าแรก 2. ผู้ใช้กดปุ่มย้อนกลับและกลับไปที่มุมมองการเข้าสู่ระบบ 3. ผู้ใช้เข้าสู่ระบบอีกครั้งและเห็นข้อผิดพลาด "โทเค็นต่อต้านการปลอมแปลงมีไว้สำหรับผู้ใช้" "แต่ผู้ใช้ปัจจุบันคือ" ชื่อผู้ใช้ "ในหน้าข้อผิดพลาดหากผู้ใช้คลิกที่แท็บอื่นจากเมนูแสดงว่าแอปพลิเคชันทำงานตามที่คาดไว้ . การใช้รหัสด้านบนผู้ใช้ยังคงสามารถกดปุ่มย้อนกลับได้ แต่จะถูกเปลี่ยนเส้นทางไปที่โฮมเพจ ดังนั้นไม่ว่าผู้ใช้จะกดปุ่มย้อนกลับกี่ครั้งก็จะเปลี่ยนเส้นทางไปยังหน้าแรก ขอบคุณ
ราวี

มีความคิดว่าเหตุใดจึงใช้ไม่ได้กับการดูเว็บ Xamarin
Noobie3001

1
สำหรับคำอธิบายทั้งหมดโปรดดูการปรับปรุงประสิทธิภาพด้วยการแคชเอาต์พุต
stomy

15

มันเกิดขึ้นหลายครั้งกับแอปพลิเคชันของฉันดังนั้นฉันจึงตัดสินใจใช้ google!

ฉันพบคำอธิบายง่ายๆเกี่ยวกับข้อผิดพลาดนี้! ผู้ใช้คลิกสองครั้งที่ปุ่มเพื่อเข้าสู่ระบบ! คุณสามารถดูผู้ใช้รายอื่นพูดคุยเกี่ยวกับเรื่องนี้ได้ที่ลิงค์ด้านล่าง:

MVC 4 ระบุโทเค็นต่อต้านการปลอมแปลงมีไว้สำหรับผู้ใช้ "" แต่ผู้ใช้ปัจจุบันคือ "ผู้ใช้"

ฉันหวังว่ามันจะช่วยได้! =)


นี่คือปัญหาของฉัน ขอบคุณ!
Nanou Ponette

8

ฉันมีปัญหาเดียวกันและแฮ็คสกปรกนี้ได้รับการแก้ไขอย่างน้อยก็จนกว่าฉันจะแก้ไขได้ด้วยวิธีที่สะอาดกว่า

    public ActionResult Login(string returnUrl)
    {
        if (AuthenticationManager.User.Identity.IsAuthenticated)
        {
            AuthenticationManager.SignOut();
            return RedirectToAction("Login");
        }

...


1
ดูเหมือนว่าฉันมีปัญหาเดียวกัน IMO ไม่ใช่การแฮ็กเป็นเรื่องธรรมดาที่เราทุกคนควรตรวจสอบเมื่อเข้าสู่ระบบหากผู้ใช้เข้าสู่ระบบแล้วเพียงแค่ลงชื่อออกจากระบบและแสดงหน้าเข้าสู่ระบบ แก้ไขปัญหาของฉันขอบคุณ
Alexandre

7

ข้อความจะปรากฏขึ้นเมื่อคุณเข้าสู่ระบบเมื่อคุณได้รับการรับรองความถูกต้องแล้ว

ตัวช่วยนี้ทำสิ่งเดียวกับ[ValidateAntiForgeryToken]แอตทริบิวต์

System.Web.Helpers.AntiForgery.Validate()

ลบ[ValidateAntiForgeryToken]แอ็ตทริบิวต์ออกจากคอนโทรลเลอร์และวางผู้ช่วยนี้ในการดำเนินการเมท ธ อด

ดังนั้นเมื่อผู้ใช้ได้รับการรับรองแล้วให้เปลี่ยนเส้นทางไปที่หน้าแรกหรือหากไม่ดำเนินการต่อด้วยการตรวจสอบโทเค็นต่อต้านการปลอมแปลงที่ถูกต้องหลังจากการตรวจสอบนี้

if (User.Identity.IsAuthenticated)
{
    return RedirectToAction("Index", "Home");
}

System.Web.Helpers.AntiForgery.Validate();

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


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

ขอบคุณสำหรับการแก้ปัญหานี้ ทำงานให้ฉันด้วย ฉันได้เพิ่มการตรวจสอบเพื่อดูว่าข้อมูลประจำตัวนั้นเหมือนกับชื่อผู้ใช้สำหรับการเข้าสู่ระบบหรือไม่และถ้าเป็นเช่นนั้นฉันก็พยายามอย่างมีความสุขในการล็อกอินผู้ใช้ต่อไปและออกจากระบบหากไม่ใช่ เช่นลองใช้ {System.Web.Helpers.AntiForgery.Validate ();} catch (HttpAntiForgeryException) {if (! User.Identity.IsAuthenticated || string.Compare (User.Identity.Name, model.Username)! = 0) {// Your log off logic here}}
Steve Owen

2

ฉันมีข้อยกเว้นเดียวกันที่เกิดขึ้นเกือบตลอดเวลาบนเซิร์ฟเวอร์การผลิต

ทำไมมันถึงเกิดขึ้น?

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

วิธีแก้?

เพียงเพิ่มบรรทัดนี้และทำงานได้อย่างสมบูรณ์แบบไม่มีข้อผิดพลาด

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]

1

ฉันมีปัญหาที่ค่อนข้างเฉพาะเจาะจง แต่คล้ายกันในขั้นตอนการลงทะเบียน เมื่อผู้ใช้คลิกลิงก์อีเมลที่ส่งถึงพวกเขาจะเข้าสู่ระบบและส่งตรงไปยังหน้าจอรายละเอียดบัญชีเพื่อกรอกข้อมูลเพิ่มเติม รหัสของฉันคือ:

    Dim result = Await UserManager.ConfirmEmailAsync(userId, code)
    If result.Succeeded Then
        Dim appUser = Await UserManager.FindByIdAsync(userId)
        If appUser IsNot Nothing Then
            Dim signInStatus = Await SignInManager.PasswordSignInAsync(appUser.Email, password, True, shouldLockout:=False)
            If signInStatus = SignInStatus.Success Then
                Dim identity = Await UserManager.CreateIdentityAsync(appUser, DefaultAuthenticationTypes.ApplicationCookie)
                AuthenticationManager.SignIn(New AuthenticationProperties With {.IsPersistent = True}, identity)
                Return View("AccountDetails")
            End If
        End If
    End If

ฉันพบว่า Return View ("AccountDetails") ให้ข้อยกเว้นโทเค็นแก่ฉันฉันเดาว่าเพราะฟังก์ชัน ConfirmEmail ถูกตกแต่งด้วย AllowAnonymous แต่ฟังก์ชัน AccountDetails มี ValidateAntiForgeryToken

การเปลี่ยน Return to Return RedirectToAction ("AccountDetails") ช่วยแก้ปัญหาให้ฉันได้


1
[OutputCache(NoStore=true, Duration=0, VaryByParam="None")]

public ActionResult Login(string returnUrl)

คุณสามารถทดสอบได้โดยใส่จุดพักไว้ที่บรรทัดแรกของการดำเนินการเข้าสู่ระบบ (รับ) ก่อนที่จะเพิ่มคำสั่ง OutputCache เบรกพอยต์จะถูกโจมตีในการโหลดครั้งแรก แต่หลังจากคลิกปุ่มย้อนกลับของเบราว์เซอร์มันจะไม่ หลังจากเพิ่มคำสั่งคุณควรจบลงด้วยการที่เบรกพอยต์ถูกโจมตีทุกครั้งดังนั้น AntiForgeryToken จะเป็นแกนหลักไม่ใช่สิ่งที่ว่างเปล่า


0

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

คอนโทรลเลอร์ (NB ฉันกำลังจัดการผู้ใช้ด้วย ASP.NET Core Identity):

[Authorize]
[ValidateAntiForgeryToken]
public class AccountController : Controller
{
    private SignInManager<IdentityUser> signInManager;
    private UserManager<IdentityUser> userManager;
    private IUserClaimsPrincipalFactory<IdentityUser> userClaimsPrincipalFactory;

    public AccountController(SignInManager<IdentityUser> signInManager, UserManager<IdentityUser> userManager, IUserClaimsPrincipalFactory<ApplicationUser> userClaimsPrincipalFactory)
    {
        this.signInManager = signInManager;
        this.userManager = userManager;
        this.userClaimsPrincipalFactory = userClaimsPrincipalFactory;
    }

    [HttpPost]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string username, string password)
    {
        if (username == null || password == null)
        {
            return BadRequest(); // Alias of 400 response
        }

        var result = await signInManager.PasswordSignInAsync(username, password, false, lockoutOnFailure: false);
        if (result.Succeeded)
        {
            var user = await userManager.FindByNameAsync(username);

            // Must manually set the HttpContext user claims to those of the logged
            // in user. Otherwise MVC will still include a XSRF token for the "null"
            // user and token validation will fail. (MVC appends the correct token for
            // all subsequent reponses but this isn't good enough for a single page
            // app.)
            var principal = await userClaimsPrincipalFactory.CreateAsync(user);
            HttpContext.User = principal;

            return Json(new { username = user.UserName });
        }
        else
        {
            return Unauthorized();
        }
    }

    [HttpPost]
    public async Task<IActionResult> Logout()
    {
        await signInManager.SignOutAsync();

        // Removing identity claims manually from the HttpContext (same reason
        // as why we add them manually in the "login" action).
        HttpContext.User = null;

        return Json(new { result = "success" });
    }
}

ตัวกรองผลลัพธ์เพื่อต่อท้ายคุกกี้ต่อต้านเชื้อรา:

public class XSRFCookieFilter : IResultFilter
{
    IAntiforgery antiforgery;

    public XSRFCookieFilter(IAntiforgery antiforgery)
    {
        this.antiforgery = antiforgery;
    }

    public void OnResultExecuting(ResultExecutingContext context)
    {
        var HttpContext = context.HttpContext;
        AntiforgeryTokenSet tokenSet = antiforgery.GetAndStoreTokens(context.HttpContext);
        HttpContext.Response.Cookies.Append(
            "MyXSRFFieldTokenCookieName",
            tokenSet.RequestToken,
            new CookieOptions() {
                // Cookie needs to be accessible to Javascript so we
                // can append it to request headers in the browser
                HttpOnly = false
            } 
        );
    }

    public void OnResultExecuted(ResultExecutedContext context)
    {

    }
}

Startup.cs แตก:

public partial class Startup
{
    public Startup(IHostingEnvironment env)
    {
        //...
    }

    public IConfigurationRoot Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {

        //...

        services.AddAntiforgery(options =>
        {
            options.HeaderName = "MyXSRFFieldTokenHeaderName";
        });


        services.AddMvc(options =>
        {
            options.Filters.Add(typeof(XSRFCookieFilter));
        });

        services.AddScoped<XSRFCookieFilter>();

        //...
    }

    public void Configure(
        IApplicationBuilder app,
        IHostingEnvironment env,
        ILoggerFactory loggerFactory)
    {
        //...
    }
}

-3

มีปัญหาเกี่ยวกับการตรวจสอบความถูกต้องของโทเค็นต่อต้านการปลอมแปลงในร้านอินเทอร์เน็ต: ผู้ใช้เปิดแท็บจำนวนมาก (พร้อมสินค้า) และหลังจากเข้าสู่ระบบครั้งหนึ่งพยายามเข้าสู่ระบบอื่นและได้รับ AntiForgeryException ดังกล่าว ดังนั้น AntiForgeryConfig.SuppressIdentityHeuristicChecks = true ไม่ได้ช่วยฉันดังนั้นฉันจึงใช้ hackfix ที่น่าเกลียดเช่นนี้บางทีมันอาจจะเป็นประโยชน์สำหรับใครบางคน:

   public class ExceptionPublisherExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext exceptionContext)
    {
        var exception = exceptionContext.Exception;

        var request = HttpContext.Current.Request;
        if (request != null)
        {
            if (exception is HttpAntiForgeryException &&
                exception.Message.ToLower().StartsWith("the provided anti-forgery token was meant for user \"\", but the current user is"))
            {
                var isAjaxCall = string.Equals("XMLHttpRequest", request.Headers["x-requested-with"], StringComparison.OrdinalIgnoreCase);
                var returnUrl = !string.IsNullOrWhiteSpace(request["returnUrl"]) ? request["returnUrl"] : "/";
                var response = HttpContext.Current.Response;

                if (isAjaxCall)
                {
                    response.Clear();
                    response.StatusCode = 200;
                    response.ContentType = "application/json; charset=utf-8";
                    response.Write(JsonConvert.SerializeObject(new { success = 1, returnUrl = returnUrl }));
                    response.End();
                }
                else
                {
                    response.StatusCode = 200;
                    response.Redirect(returnUrl);
                }
            }
        }


        ExceptionHandler.HandleException(exception);
    }
}

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new ExceptionPublisherExceptionFilter());
        filters.Add(new HandleErrorAttribute());
    }
}

คิดว่ามันจะดีมากถ้าสามารถตั้งค่าตัวเลือกการต่อต้านการปลอมแปลงโทเค็นเพื่อยกเว้นชื่อผู้ใช้หรืออะไรทำนองนั้น


12
นี่เป็นตัวอย่างที่น่ากลัวในการจัดการกับปัญหาในคำถาม อย่าใช้สิ่งนี้
xxbbcc

เห็นด้วยอย่างยิ่งกับ xxbbcc
Javier

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

@ user3364244: พฤติกรรมที่ถูกต้องสามารถทำสิ่งต่อไปนี้: ตรวจจับการเข้าสู่ระบบภายนอกโดยใช้ websockets หรือ signalR นี่เป็นเซสชั่นเดียวกันดังนั้นคุณสามารถทำให้มันใช้งานได้ฉันเดา :-)
dampee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.