mtweb 2017-11-03 08:41 采纳率: 0%
浏览 936

MVC5"提供的防伪标记适用于其他基于声明的用户,而不适用于当前用户。"

MVC5 "提供的防伪标记适用于其他基于声明的用户,而不适用于当前用户。"
发生场景:同时打开两个或多个带表单页面A和B(都是未登陆状态),对B页面进行登陆,然后返回A(不刷新),这时提交A表单,就会出现上述错误提示。

请问下 当用户登陆状态发生改变的时候,如何更新已打开的所有页面的防伪标记,或者提交表单时把防伪标记另作特殊处理而不报错?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 03:26
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在.NET MVC 5中,你可以使用SessionState来存储用户的状态信息,包括是否已经登录。当用户在另一个页面上尝试访问某个控制器的方法时,你可以检查用户的会话状态,并相应地更新防伪标记。

    以下是一个示例:

    1. 在一个包含用户认证功能的控制器中,你可以在AuthenticateUser方法后添加一些逻辑来保存用户的会话状态。
    public ActionResult AuthenticateUser(string returnUrl)
    {
        // 验证用户身份并存储会话状态
        var user = this.AuthenticateUser(returnUrl);
        if (user != null)
        {
            Session["UserId"] = user.Id;
            return View("Index");
        }
        else
        {
            return View();
        }
    }
    
    1. 在你需要验证用户身份的视图中,你可以从Session获取用户的ID,并将其传递给相应的控制器方法。

    2. 如果用户已经登录,你应该更新防伪标记。例如,在你的控制器中,可以这样更新:

    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
        {
            // 用户尚未登录,清空防伪标记
            // ...
        }
    }
    
    1. 在你的主控制器中,调用UpdateAuthenticationStatus方法来确保所有需要验证用户身份的地方都更新了防伪标记。
    public ActionResult Index()
    {
        UpdateAuthenticationStatus();
    
        // 其他视图代码...
    }
    

    请注意,这个解决方案可能需要根据你的具体需求进行调整。例如,你可能需要处理不同的用户状态,或者在某些情况下清除防伪标记。此外,你还需要确保在所有需要验证用户身份的地方调用了UpdateAuthenticationStatus方法。

    评论

报告相同问题?