Po spędzeniu dużo czasu z dochodzenia, stosując kombinację Sentry i Azure logów serwera WWW, Znalazłem 2 głównych przyczyn wymienionych błędów:
1) na telefony komórkowe, kiedy przeglądarka znajduje się w tle, może zostać nagle zatrzymana przez system operacyjny w celu zwolnienia zasobów. W takim przypadku zwykle strona jest zapisywana na dysku telefonu i ponownie ładowana po ponownym otwarciu przeglądarki.
Problem polega na tym, że do tego czasu token anty-forgery, który jest plikiem cookie sesji, już wygasł, ponieważ jest to zasadniczo nowa sesja. Tak więc strona ładuje się bez użycia modułu Anti-Forgery Cookie, używając HTML z poprzedniej sesji. Powoduje to wyjątek The required anti-forgery cookie is not present
.
2) Chociaż pozornie związany, wyjątek tokens do not match
jest zwykle tylko stycznie spokrewniony. Przyczyną wydaje się zachowanie użytkownika podczas otwierania wielu kart w tym samym czasie.
Plik cookie zapobiegający fałszowaniu jest przypisywany tylko wtedy, gdy użytkownik dotrze do strony z formularzem. Oznacza to, że mogą przejść do Twojej strony głównej i nie mają pliku cookie zapobiegającego fałszerstwu. Następnie mogą otwierać wiele kart za pomocą kliknięcia środkowym przyciskiem myszy. Wielokrotne zakładki to wiele równoległych żądań, z których każda zawiera plik cookie zapobiegający fałszowaniu.
Ponieważ żądania te nie zawierają pliku cookie zapobiegającego fałszowaniu, dla każdego z nich program ASP.NET generuje osobny pseudolosowy plik cookie i używa go w formularzu; jednak zostanie zatrzymany tylko wynik ostatniego odebranego nagłówka. Oznacza to, że wszystkie pozostałe strony będą miały nieprawidłowe tokeny na stronie, ponieważ ich plik cookie zapobiegający fałszowaniu został nadpisany.
rozwiązania, jakie stworzył globalną że filtr powinien upewnić się, że
- Anti-Fałszerstwo cookie jest przypisany na dowolnej stronie, nawet jeśli strona nie ma formy i
- anty -Forgery cookie nie jest związane z sesją. Czas życia powinien być dopasowany do tokena logowania użytkownika, ale powinien się utrzymywać między sesjami, na wypadek gdyby urządzenie mobilne wczytało stronę bez sesji.
Poniższy kod to FilterAttribute
, który należy dodać wewnątrz FilterConfig.cs
jako filtr globalny. Proszę zauważyć, że chociaż nie wierzę, że spowodowałoby to lukę w zabezpieczeniach, nie jestem ekspertem od zabezpieczeń, więc wszelkie dane wejściowe są mile widziane.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AntiForgeryFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var cookie = filterContext.HttpContext.Request.Cookies.Get(AntiForgeryConfig.CookieName);
var addCookie = true;
if (string.IsNullOrEmpty(cookie?.Value))
{
cookie = filterContext.HttpContext.Response.Cookies.Get(AntiForgeryConfig.CookieName);
addCookie = false;
}
if (string.IsNullOrEmpty(cookie?.Value))
{
AntiForgery.GetTokens(null, out string cookieToken, out string _);
cookie = new HttpCookie(AntiForgeryConfig.CookieName, cookieToken)
{
HttpOnly = true,
Secure = AntiForgeryConfig.RequireSsl
};
}
cookie.Expires = DateTime.UtcNow.AddYears(1);
if(addCookie) filterContext.HttpContext.Response.Cookies.Add(cookie);
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
Czy kiedykolwiek znalazłeś odpowiedź na to pytanie? –
Nie, musieliśmy usunąć kontrolę antywłamaniową (była używana do prostych formularzy integracyjnych, nie ma w tym nic krytycznego). Nasza konfiguracja Azure miała dwie logiczne płyty CD, więc domyślam się, że jest związana z różnymi płytami CD obsługującymi żądanie i odpowiedź. To tylko moje przypuszczenie. – TamerM
Przykro mi to słyszeć, chociaż nie sądzę, że powinno to stanowić problem, chyba że masz domenę zdefiniowaną również w działaniu formularza (co przekieruje użytkownika na inną płytę CD dla POST, ale wątpię, że będzie tak, ponieważ jeśli użyjesz UrlHelper, to nie przekieruje użytkowników między domenami). –