Używam metody pomocnika AntiForgeryToken
. Z tego, co rozumiem na temat AntiForgeryToken, wynika, że jest to baza sesji, więc każdy użytkownik ma ten sam token, ale inny użytkownik będzie miał inny token (pod warunkiem, że użyjesz tych samych soli dla wszystkich formularzy). Mój "problem" polega na tym, że AntiForgeryToken
generuje różne tokeny dla tego samego użytkownika z tą samą solą. Na przykład ...Zmiany klucza AntiForgeryToken na żądanie
Contoller
public ActionResult Test()
{
return View();
}
View
@using (Html.BeginForm())
{
@Html.AntiForgeryToken("Salty!")
}
Zapytanie Wyjście # 1
<input name="__RequestVerificationToken" type="hidden" value="K1sijFuYvyGUJjGg33OnLjJaU3tFpGFDutRt9TOFSkZ6FcrhJMMQPnOqjIHuTwBXs/sPBXEiE+1qyV9l63nnSO161b+OtLbaBoPC7K3/7wxtnuSY+N0o/fqBgVoDyac4dNVp+OvanKBSrHINKfc3WEg9269BHOJNzFowC6Aeac/afAGTGrBypxUHfqrKVowD" />
Wyjście Zapytanie # 2
<input name="__RequestVerificationToken" type="hidden" value="mOpP6LMQXnCmjr5/Wdtnhguh3PyZxWj7GWf8LYzZXPKcJBBT+DbAHvynquSD65O0DBw1RKR7DxCNg372ukftCOWms+o75CraMyFMnvjGk7RU+znIQm05eRQvr5H6d/MDyn+0DWm3jLnMBM9GplsgMRqbdAHzSe69/cS2x9A4X/9jFTZQHUWXXHUr0xewF8Rk" />
Klawisze są różne dla tej samej sesji z tej samej soli. Czy mam fundamentalne niezrozumienie ochrony CRSF? A może to nowa funkcja?
Czy zmienia dane sesji na serwerze po wydaniu nowego tokena? Wszystkie wartości moich plików cookie pozostają takie same. Myślałem, że wartość pliku cookie __RequestVerificationToken_Lw__ ulegnie zmianie. –
Nie, serwer ustawia plik cookie na kliencie. Klient wysyła następnie tę samą wartość dwukrotnie podczas wysyłania. Po zakodowaniu w danych formularza i raz w ciasteczku (pliki cookie są przesyłane na serwer do POST). Serwer zna tylko klucz szyfrowania. Nie przechowuje niczego innego w celach anty XSRF. – m0sa
Każdy powód, aby nie przechowywać po prostu tokenów w sesji i nigdy nie wysłać go do klienta? Coś jak: AntiForgery.GetTokens (null, out cookieToken, out formToken); return cookieToken + ":" + formToken; Następnie zapamiętaj to w sesji? –