我已经在我的登录页面上实现了防伪令牌。
现在我让一个用户按下键盘上的返回键,当他们在填写凭据后再次单击登录按钮时,他们得到错误页面。
有没有更好的方法来处理这种情况,比如将它们重定向到新的登录页面?
作为登录页面的页面是:/account/logon
如果登录详细信息成功,用户将被重定向到用户按下按钮返回的 :Home/Index 页面。
我已经在我的登录页面上实现了防伪令牌。
现在我让一个用户按下键盘上的返回键,当他们在填写凭据后再次单击登录按钮时,他们得到错误页面。
有没有更好的方法来处理这种情况,比如将它们重定向到新的登录页面?
作为登录页面的页面是:/account/logon
如果登录详细信息成功,用户将被重定向到用户按下按钮返回的 :Home/Index 页面。
不要在您的登录页面上实现 ASP.NET AntiForgeryToken。该令牌基于用户名以及其他标准,并且登录页面假定攻击者已经拥有系统凭据,以便能够利用该页面上的 csrf。
但是,您应该在登录页面上使用某种形式的 CSRF 保护 - 请参阅https://security.stackexchange.com/a/2126/51772
我在这里写了一个完整的解决方案: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>
}
我对此的解决方案是:
如果页面再次点击登录页面,请重新加载页面。这将确保新加载防伪令牌
一切都完成了
我没有像提到的其他一些帖子那样检查 User.Identity.IsAuthenticated,而是使用自定义属性来处理异常并将用户重定向到主页(如果它是 HttpAntiForgeryToken)
我相信这避免了使用其他方法的任何潜在安全问题,并且应该始终在 POST 方法上使用 [ValidateAntiForgeryToken]
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;
}
}