web-dev-qa-db-ja.com

ログインページの偽造防止トークン

ログインページに偽造防止トークンを実装しました。

これで、1人のユーザーがキーボードの戻るキーを押し、資格情報を入力した後でログインボタンをもう一度クリックすると、エラーページが表示されます。

新しいログインページにリダイレクトするなど、このケースを処理するためのより良い方法はありますか?

ログインページであるページは:/ account/login

ログインの詳細が成功した場合、ユーザーは、ユーザーがボタンを押し戻したホーム/インデックスページにリダイレクトされます。

19
cpoDesign

これに対する私の解決策は次のとおりです。

ログインページに再度アクセスした場合は、ページをリロードします。これにより、偽造防止トークンを新たにロードできるようになります

そして、すべてが行われます

5
cpoDesign

ログインページにASP.NETAntiForgeryTokenを実装しないでください。トークンは他の基準の中でもユーザー名に基づいており、ログインページは、攻撃者がそのページでcsrfを悪用できるようにするために、システムに対する資格情報をすでに持っていることを前提としています。

ただし、ログインページで何らかの形式のCSRF保護を使用する必要があります https://security.stackexchange.com/a/2126/51772 を参照してください

20

私はここに完全な解決策を書きました: https://richardcooke.info/en/2014/keep-users-signed-in-after-asp-net-deploy/

GETメソッドからコントローラーを呼び出すために必要なコードは次のとおりです。

private void SetANewRequestVerificationTokenManuallyInCookieAndOnTheForm()
{
    if (Response == null)
        return;

    string cookieToken, formToken;
    AntiForgery.GetTokens(null, out cookieToken, out formToken); 
    SetCookie("__RequestVerificationToken", cookieToken);
    ViewBag.FormToken = formToken;
}

private void SetCookie(string name, string value)
{
   if (Response.Cookies.AllKeys.Contains(name))
       Response.Cookies[name].Value = value;
   else
       Response.Cookies.Add(new HttpCookie(name, value));
}

html.AntiForgeryToken()の代わりにビューに配置するコード:

@if (ViewBag.FormToken != null)
{
    <text><input name="__RequestVerificationToken" type="hidden" value="@ViewBag.FormToken" /></text>
}
else
{
    <text>@Html.AntiForgeryToken()</text>
}
7
Richard

前述の他のいくつかの投稿のようにUser.Identity.IsAuthenticatedをチェックする代わりに、カスタム属性を使用して例外を処理し、HttpAntiForgeryTokenの場合はユーザーをホームページにリダイレクトしました

これにより、他のメソッドを使用することによる潜在的なセキュリティ上の懸念が回避され、[ValidateAntiForgeryToken]は常にPOSTメソッドで使用する必要があると思います。

public override void OnException(ExceptionContext filterContext)
    {
        var controllerName = (string)filterContext.RouteData.Values["controller"];
        var actionName = (string)filterContext.RouteData.Values["action"];
        var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
        if (filterContext.Exception is HttpAntiForgeryException)
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                {
                    { "action", "Index" },
                    { "controller", "Home" }
                });

            filterContext.ExceptionHandled = true;
        }
}
0
bla9x