c# visual ログオフを試みると、提供された偽造防止トークンはユーザー "XXXX" を対象としていましたが、現在のユーザーは ""



asp.net mvc 入門 (2)

@cemの答えは本当に役に立ちました。私はantiforgerytokenと期限切れのセッションでajax呼び出しのシナリオを含めるために小さな変更を追加しました。

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;
    }
}

...そしてクライアント側では、グローバルAjaxエラーハンドラを追加してログイン画面にリダイレクトすることができます...

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

https://ffff65535.com

私はMVC 4アプリを持っていて、フォームセッションが終了してからユーザーがログオフしようとすると問題が発生します。

Ex。 タイムアウトは5分に設定されています。 ユーザーはログインします。ユーザーは10分間何もしません。 ユーザーは[ログオフ]リンクをクリックします。 ユーザーにエラーが表示されます: "提供された偽造トークンはユーザー" XXXX "のものですが、現在のユーザーは" "です。

ユーザーは、これを回避するために何らかの体操をしなければならなかったので、再ログインしてログアウトすることができます(ログアウトは、その日のタイムカードを閉じるために使用されています)。

私はなぜこれが起こるかを理解していると思いますが、それを修正する方法がわかりません。

編集:私はこれが起こっていると思う理由は、もともとページが読み込まれ、現在ログインしているユーザーのためにAntiForgeryトークンが生成されたためです。 しかし、セッションが終了してログオフページに移動しようとすると、現在のユーザーは実際のユーザーではなく ""になります。 したがって、不一致があり、エラーがレンダリングされます。


実際には、 /Account/LoginリダイレクトするIExceptionFilterを使って処理できます

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() 
{
}

また、 [HandleError(ExceptionType=typeof(HttpAntiForgeryException)...]を使用できますが、customErrors Onが必要です。





asp.net-mvc