Soru Sağlama girişiminde bulunulduğunda, sağlanan "Sahtekarlık" jetonu "XXXX" kullanıcısı içindir, ancak geçerli kullanıcı ""


Bir MVC 4 uygulamasına sahibim ve formlar oturumunun süresi dolduğunda sorunlar yaşıyor ve kullanıcı kapatmaya çalışıyor.

Ör. zaman aşımı 5 dk. Kullanıcı giriş yapar. Kullanıcı 10 dakika boyunca hiçbir şey yapmaz. Kullanıcı LogOff bağlantısını tıklar. Kullanıcı hata alıyor: "Sağlanan anti-dolandırıcılık jetonu" XXXX "kullanıcısına yönelikti, ancak mevcut kullanıcı" "."

Kullanıcı daha sonra tekrar gitmek için bazı cimnastiklerden geçmek zorunda kaldı, böylece yeniden oturum açıp tekrar kapatabilirler (çıkış, gün için zaman kartlarını kapatmak için kullanılıyor).

Sanırım bunun neden olduğunu anlıyorum ... ama nasıl düzelteceğimi bilmiyorum.

DÜZENLE: Bunun neden olduğunu düşünüyorum çünkü başlangıçta sayfa yüklendiğinde, şu anda oturum açmış olan kullanıcı için AntiForgery belirteci oluşturulur. Ancak, oturumun süresi dolduğunda ve çıkış sayfasına gitmeye çalıştıklarında, geçerli kullanıcı gerçek kullanıcı yerine "" olur. Gibi bir uyumsuzluk var ve hata ortaya çıkıyor.


18
2018-05-07 01:47


Menşei


Hipotezinizi, neden hata oluştuğunu paylaşabilir misiniz? - J0e3gan
bir ilgili gönderi dikkate değer görünüyor. - J0e3gan
Oturum kapatma işleminiz neden sahtekârlık karşıtı bir jetona ihtiyaç duyuyor? Olmaması gerektiği gibi görünüyor. - Craig Stuntz
Tanımladığınız davranış (ve üzerinde çalışmak için gereken "jimnastik") IMO'dur. Oturum kapatma sayfanız önceden giriş yapmış olan kullanıcı için bir işlem gerçekleştirirse, doğru kullanıcı için işlemi gerçekleştirdiğinizden emin olun. - C.B.
Logonuzun bir operasyon sonrası olduğunu mu sanıyorum? Bu bir sorun olsaydı, bu sorun olmazdı, ancak oturum açmak için bir yazı yapılması önerilir. - Brian Mains


Cevaplar:


Aslında bununla başa çıkabilirsin. IExceptionFilter, bu yönlendirilecek /Account/Login

public class HandleAntiForgeryError : ActionFilterAttribute, IExceptionFilter
{
    #region IExceptionFilter Members

    public void OnException(ExceptionContext filterContext)
    {
        var exception = filterContext.Exception as HttpAntiForgeryException;
        if (exception != null)
        {
            var routeValues = new RouteValueDictionary();
            routeValues["controller"] = "Account";
            routeValues["action"] = "Login";
            filterContext.Result = new RedirectToRouteResult(routeValues);
            filterContext.ExceptionHandled = true;
        }
    }

    #endregion
}

[HandleAntiForgeryError]
[ValidateAntiForgeryToken]
public ActionResult LogOff() 
{
}

Ayrıca kullanabilirsiniz [HandleError(ExceptionType=typeof(HttpAntiForgeryException)...] ancak customErrors On gerektirir.


23
2017-10-19 22:04



Mükemmel! Sadece ihtiyacım olan teşekkürler! - Chris Nevill
Bunun cevap olarak işaretlenmediğine inanamıyorum. Bu cevap inanılmaz. - Alex Dresko
Buna değer, bu benim için işe yaramıyor. Oturumu kapattığımda, uygulama aynı hatayı engelliyor. Ancak, özel durum türü, HttpAntiforgeryException yerine InvalidOperationException şeklindedir. Bu çok genel bir işlemdir ve bunu basit bir şekilde ele almayı tehlikeli kılar: - Sinaesthetic
Burada önerilen hemen her şeyi denedim: stackoverflow.com/questions/14970102/... ama bu yazı sonunda hile yaptı - ckonig
Bu benim problemimi çözdü. Teşekkürler! - Sabo


@Cem'in cevabı benim için gerçekten yararlı oldu ve ajax çağrılarının senaryosunu antiforgerytoken ve süresi dolan oturumla dahil etmek için küçük bir değişiklik ekledim.

public void OnException(ExceptionContext filterContext)
{
    var exception = filterContext.Exception as HttpAntiForgeryException;
    if (exception == null) return;

    if (filterContext.HttpContext.Request.IsAjaxRequest())
    {
        filterContext.HttpContext.Response.StatusCode = 403;
        filterContext.ExceptionHandled = true;
    }
    else
    {
        var routeValues = new RouteValueDictionary
        {
            ["controller"] = "Account",
            ["action"] = "Login"
        };
        filterContext.Result = new RedirectToRouteResult(routeValues);
        filterContext.ExceptionHandled = true;
    }
}

... ve istemci tarafında giriş ekranına yönlendirmek için global bir ajax hata işleyicisi ekleyebilirsiniz ...

$.ajaxSetup({
    error: function (x) {
        if (x.status === 403) {
            window.location = "/Account/Login";
        }
    }
});

2
2017-09-12 19:06