MVC5 "提供的防伪标记适用于其他基于声明的用户,而不适用于当前用户。"
发生场景:同时打开两个或多个带表单页面A和B(都是未登陆状态),对B页面进行登陆,然后返回A(不刷新),这时提交A表单,就会出现上述错误提示。
请问下 当用户登陆状态发生改变的时候,如何更新已打开的所有页面的防伪标记,或者提交表单时把防伪标记另作特殊处理而不报错?
MVC5 "提供的防伪标记适用于其他基于声明的用户,而不适用于当前用户。"
发生场景:同时打开两个或多个带表单页面A和B(都是未登陆状态),对B页面进行登陆,然后返回A(不刷新),这时提交A表单,就会出现上述错误提示。
请问下 当用户登陆状态发生改变的时候,如何更新已打开的所有页面的防伪标记,或者提交表单时把防伪标记另作特殊处理而不报错?
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
在.NET MVC 5中,你可以使用SessionState来存储用户的状态信息,包括是否已经登录。当用户在另一个页面上尝试访问某个控制器的方法时,你可以检查用户的会话状态,并相应地更新防伪标记。
以下是一个示例:
AuthenticateUser方法后添加一些逻辑来保存用户的会话状态。public ActionResult AuthenticateUser(string returnUrl)
{
// 验证用户身份并存储会话状态
var user = this.AuthenticateUser(returnUrl);
if (user != null)
{
Session["UserId"] = user.Id;
return View("Index");
}
else
{
return View();
}
}
在你需要验证用户身份的视图中,你可以从Session获取用户的ID,并将其传递给相应的控制器方法。
如果用户已经登录,你应该更新防伪标记。例如,在你的控制器中,可以这样更新:
protected void OnAuthorization(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(
new { controller = "Home", action = "Login" }));
}
}
// 更新防伪标记的逻辑
protected void UpdateAuthenticationStatus()
{
if (this.Session["UserId"] != null)
{
// 用户已经登录,更新防伪标记
// ...
}
else
{
// 用户尚未登录,清空防伪标记
// ...
}
}
UpdateAuthenticationStatus方法来确保所有需要验证用户身份的地方都更新了防伪标记。public ActionResult Index()
{
UpdateAuthenticationStatus();
// 其他视图代码...
}
请注意,这个解决方案可能需要根据你的具体需求进行调整。例如,你可能需要处理不同的用户状态,或者在某些情况下清除防伪标记。此外,你还需要确保在所有需要验证用户身份的地方调用了UpdateAuthenticationStatus方法。