我们在登录页面上遇到了与防伪令牌有关的特定问题。如果用户仅使用一个活动窗口登录,则一切正常,但是如果用户在两个不同的窗口中打开登录页面并从窗口 A 登录(没有问题将登录),然后在此窗口中返回从窗口 B 登录用户将收到“未提供所需的防伪令牌或无效”。
有没有办法解决这个问题,然后从视图/控制器操作中删除防伪令牌?我们希望拥有令牌以提高安全性!
这与这个问题非常相似,但是这是针对 mvc2 MVC ValidateAntiForgeryToken 多选项卡问题提出的
我们在登录页面上遇到了与防伪令牌有关的特定问题。如果用户仅使用一个活动窗口登录,则一切正常,但是如果用户在两个不同的窗口中打开登录页面并从窗口 A 登录(没有问题将登录),然后在此窗口中返回从窗口 B 登录用户将收到“未提供所需的防伪令牌或无效”。
有没有办法解决这个问题,然后从视图/控制器操作中删除防伪令牌?我们希望拥有令牌以提高安全性!
这与这个问题非常相似,但是这是针对 mvc2 MVC ValidateAntiForgeryToken 多选项卡问题提出的
MVC3 或 MVC4 中的这种行为是按照设计的,但是如上所述它对用户非常不友好,但是在生产中这个问题需要优雅地解决,并且应用程序需要处理这种奇怪的情况。此问题的解决方案是创建一个应用于登录帖子的过滤器,该过滤器将验证用户是否已登录并将他们带到正确的页面,否则他们将保留在登录页面上。
下面是过滤器属性的代码
/// <summary>
/// Handle Antiforgery token exception and redirect to customer area if the user is Authenticated
/// </summary>
public class RedirectOnError : HandleErrorAttribute
{
/// <summary>
/// Override the on exception method and check if the user is authenticated and redirect the user
/// to the customer service index otherwise continue with the base implamentation
/// </summary>
/// <param name="filterContext">Current Exception Context of the request</param>
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception is HttpAntiForgeryException && filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// Set response code back to normal
filterContext.HttpContext.Response.StatusCode = 200;
// Handle the exception
filterContext.ExceptionHandled = true;
UrlHelper urlH = new UrlHelper(filterContext.HttpContext.Request.RequestContext);
// Create a new request context
RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData);
// Create a new return url
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "CustomerArea", action = "Index" })).VirtualPath;
// Check if there is a request url
if (filterContext.HttpContext.Request.Params["ReturnUrl"] != null && urlH.IsLocalUrl(filterContext.HttpContext.Request.Params["ReturnUrl"]))
{
url = filterContext.HttpContext.Request.Params["ReturnUrl"];
}
// Redirect the user back to the customer service index page
filterContext.HttpContext.Response.Redirect(url, true);
}
else
{
// Continue to the base
base.OnException(filterContext);
}
}
}
这是使用示例
[HttpPost]
**[RedirectOnError]**
[ValidateAntiForgeryToken]
public ActionResult LogOn(LogOnViewModel model, UserSessionState session, string returnUrl)
{
.....
}
登录后,之前的所有令牌均无效。这就是它应该如何工作的方式。Naz 接近正确答案,除了 cookie 中的令牌不存储用户名。只有表单中的令牌可以。正是因为这个问题:如果用户登录,所有现有的表单令牌都应该失效,但是使cookie本身失效会太麻烦并且对用户不友好。