Tworzę aplikację jednostronicową i mam problem z tokenami chroniącymi przed fałszerstwem.
Wiem, dlaczego tak się dzieje, ale nie wiem, jak go naprawić.
Pojawia się błąd, gdy dzieje się co następuje:
- Niezalogowany użytkownik ładuje okno dialogowe (z wygenerowanym tokenem zabezpieczającym przed fałszerstwem)
- Użytkownik zamyka okno dialogowe
- Użytkownik loguje się
- Użytkownik otwiera to samo okno dialogowe
- Użytkownik przesyła formularz w oknie dialogowym
Token zabezpieczający przed fałszerstwem jest przeznaczony dla użytkownika „”, ale aktualnym użytkownikiem jest „nazwa użytkownika”
Powodem tego jest to, że moja aplikacja jest w 100% jednostronicowa, a kiedy użytkownik loguje się pomyślnie za pośrednictwem posta w AJAX /Account/JsonLogin
, po prostu przełączam bieżące widoki z „widokami uwierzytelnionymi” zwróconymi z serwera, ale nie ładuję ponownie strona.
Wiem, że to jest powód, ponieważ jeśli po prostu przeładuję stronę między krokami 3 i 4, nie ma błędu.
Wygląda więc na to, że @Html.AntiForgeryToken()
w załadowanej formie nadal zwraca token dla starego użytkownika, dopóki strona nie zostanie ponownie załadowana.
Jak mogę zmienić, @Html.AntiForgeryToken()
aby zwrócić token dla nowego, uwierzytelnionego użytkownika?
Wstrzykuję nowy GenericalPrincipal
z niestandardowym IIdentity
na co Application_AuthenticateRequest
tak, zanim @Html.AntiForgeryToken()
zostanie wywołany HttpContext.Current.User.Identity
, w rzeczywistości moja niestandardowa tożsamość z IsAuthenticated
właściwością ustawioną na true, a mimo to @Html.AntiForgeryToken
nadal wydaje się renderować token dla starego użytkownika, chyba że wykonam ponowne załadowanie strony.