c# - 防伪 token 无法解密&防伪 cookie token 和表单字段 token 在部署中不匹配

标签 c# asp.net-mvc asp.net-mvc-5

我的部署服务器有时遇到这个问题,它让我发疯,因为我无法在本地主机中重现,我尝试在我的 web.config 中添加机器 key ,但没有运气,所以远。

这只发生在登录页面。

我的布局:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")

</head>
<body>
    <form id="__AjaxAntiForgeryForm" action="#" method="post">
        @Html.AntiForgeryToken()
    </form>

    <div class="wcenter">
        @Html.Partial("_LoginPartial")
    </div>

    <br />

    <div class="wcenter">
        @RenderBody()
    </div>

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/bootstrap")
    @Scripts.Render("~/bundles/pluginjs")
    @Scripts.Render("~/bundles/customjs")
    @RenderSection("scripts", required: false)
</body>
</html>

我的登录页面

@model LoginViewModel
@{
    ViewBag.Title = "Log in";
}

<h2>@ViewBag.Title.</h2>
            @using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
            {
                @Html.AntiForgeryToken()

                @Html.LabelFor(m => m.Username)
                @Html.TextBoxFor(m => m.Username)
                @Html.ValidationMessageFor(m => m.Username)

                @Html.LabelFor(m => m.Password)
                @Html.PasswordFor(m => m.Password)
                @Html.ValidationMessageFor(m => m.Password)

                <input type="submit" value="LOGIN" />
            }

Controller :

    [AllowAnonymous]
    public ActionResult Login()
    {
        if (Request.IsAuthenticated)
        {
            return RedirectToAction("Index", "Home");
        }

        return View();
    }

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (Request.IsAuthenticated)
        {
            return RedirectToAction("Index", "Home");
        }

        if (!ModelState.IsValid)
        {
            return View(model);
        }

        var user = new ApplicationUser() { UserName = model.Username, Id = model.Username };
        var result = await UserManager.CheckPasswordAsync(user, model.Password);

        if (result == true)
        {
            if (UserManager.FindByName(user.UserName) == null)
            {
                var res = UserManager.Create(user);

                if (!res.Succeeded)
                {
                    ModelState.AddModelError("", res.Errors.FirstOrDefault());
                    return View(model);
                }
            }

            SignInManager.SignIn(user, true, true);
            return RedirectToAction("Index", "Home");
        }

        ModelState.AddModelError("", "Invalid login attempt.");
        return View(model);
    }

任何帮助将不胜感激。

最佳答案

这是因为您正在创建 2 个防伪 token ,一个在表单内,另一个在您的部分 View 中。所以有时CSRF创建的cookie与CSRF输入隐藏字段不匹配

关于c# - 防伪 token 无法解密&防伪 cookie token 和表单字段 token 在部署中不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348830/

相关文章:

c# - 如何在变量声明 (CS0270) 中强制执行数组的长度?

c# - 在c#中均分

c# - 如果变量不是我期望的结果,则会显示错误消息

asp.net-mvc - ASP.NET mvc 4 Controller 参数在将 json 发送到 Controller 时始终为空,为什么?

c# - MVC Identity 2.0 和管理角色

c# - WebBrowser 通过 html 中的链接在内部存储的 html 资源之间导航

c# - 使用 C# 将插入推送到 SQL Server?

javascript - ng-if AngularJS中的日期比较不是年份

c# - MVC中id的特殊含义是什么

asp.net-mvc-5 - MVC 5 自定义路由 - 第 16 章 Apress 的 LegacyRoute : RouteBase (Example from the book Pro ASP. NET MVC 5 中的错误 404)