登录页面上的防伪标记

cpo*_*ign 19 c# antiforgerytoken asp.net-mvc-3

我在登录页面上实现了防伪令牌.

现在我有一个用户按下键盘上的后退键,当他们在填写凭据后再次点击登录按钮时,他们会收到错误页面.

是否有一些更好的方法来处理这种情况,比如将它们重定向到新的登录页面?

登录页面是:/ account/logon

如果登录详细信息已成功,则用户将被重定向到:主页/索引页面,用户在该页面上按下按钮.

Ada*_*SFT 20

不要在登录页面上实现ASP.NET AntiForgeryToken.令牌基于其他条件中的用户名,登录页面假定攻击者已拥有系统凭据,以便能够利用该页面上的csrf.

但是,您应该在登录页面上使用某种形式的CSRF保护 - 请参阅https://security.stackexchange.com/a/2126/51772

  • 我对@AdamTuliper的回复非常信服,直到我偶然发现 - http://security.stackexchange.com/questions/2120/when-the-use-of-a-antiforgerytoken-is-not-required-needed参考这篇论文 - http://www.adambarth.com/papers/2008/barth-jackson-mitchell-b.pdf - 这是一篇相当不错的读物 (13认同)
  • 危险 - 不要**这样做!@aix是正确的,这个答案引入了一个安全漏洞,其中可以使用CSRF请求强制登录攻击者控制的凭据.然后,攻击者可以使用同一帐户查看用户在网站上的活动.请参阅http://en.wikipedia.org/wiki/Cross-site_request_forgery#Forging_login_requests和http://www.adambarth.com/papers/2008/barth-jackson-mitchell-b.pdf请考虑撤消或编辑此答案,因为这是非常危险的建议. (4认同)
  • 因此,如果我们不应该在登录页面上使用ASP.NET AntiForgeryToken并且需要一种CSRF保护形式,那么有什么好的选择呢?我的意思是有一个好的图书馆或你推荐的东西? (4认同)
  • 我应该在'asp.net mvcs实现反伪造令牌'的前面开始我的回答,因为它基于登录名.来自匿名用户的令牌可能无法提供所需的保护 - 如果我记得,在大多数情况下,我必须测试它与登录名相关联. (2认同)

Ric*_*ard 7

我在这里写了一个完整的解决方案: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));
}
Run Code Online (Sandbox Code Playgroud)

和代码放在你的视图中代替Html.AntiForgeryToken():

@if (ViewBag.FormToken != null)
{
    <text><input name="__RequestVerificationToken" type="hidden" value="@ViewBag.FormToken" /></text>
}
else
{
    <text>@Html.AntiForgeryToken()</text>
}
Run Code Online (Sandbox Code Playgroud)


cpo*_*ign 5

我的解决方案是:

如果再次点击登录页面,请重新加载页面.这将确保防伪标记的新装载

一切都完成了