【问题标题】:How to pass an AntiForgeryToken from one controller action to another?如何将 AntiForgeryToken 从一个控制器动作传递到另一个控制器动作?
【发布时间】:2017-11-09 15:00:53
【问题描述】:

我有一个这样的表格:

    using (Html.BeginForm("MockEcaCertLogin", "Authentication", new { area = "Login" }, FormMethod.Post))
    {
        @Html.ValidationSummary(true)
        @Html.AntiForgeryToken()
        <div class="well">
            <h1 class="bg-danger" style="padding:3px; border: 1px solid black">Mock ECA Login</h1>
            <div class="margin-bottom-20 margin-top-20">

                @Html.DropDownList("CertName", new List<SelectListItem>()
            {
                new SelectListItem() { Text = "First Last", Value = "First .Last.M.CCCDDDDDDDDDD.ID" },
                new SelectListItem() { Text = "First Last", Value = "First Last" },
            })

                <button type="submit" class="btn btn-default">Login</button>

            </div>
        </div>
    }

此表单发布到如下所示的控制器操作:

        [HttpPost, ValidateAntiForgeryToken, ValidateModelState]
        public void MockEcaCertLogin(string certName)
        {
            var urlHelper = new UrlHelper(this.HttpContext.Request.RequestContext);
            var destinationUrl = urlHelper.Action("Login", "Authentication");

            var headers = new NameValueCollection();
            headers.Add("X-ARR-ClientCert", certName);
            HttpContext.Server.TransferRequest(destinationUrl, true, "POST", headers);
        }

因此,表单将 ValidateAntiForgery 令牌发布到 Controller 操作。 并且该操作对该操作执行传输请求:

    //[HttpPost, ValidateAntiForgeryToken, ValidateModelState]
    [HttpPost, ValidateModelState]
    public ActionResult Login()
    {
        var certificateName = GetCertificate();

如何将 AntiForgeryToken 从第一个操作传递到下一个操作或创建一个新的传递?

通常我们有一个表单发布到第二个动作,所以我们给出了正常的:

@Html.AntiForgeryToken()

表格中的一行。

但是我正在从另一种形式做一些事情,我传递给第一个动作,然后将控制权传递给第二个动作。

但是当我走这条路时,ValidateAntiForgeryToken 属性会破坏它。

【问题讨论】:

    标签: c# asp.net-mvc razor antiforgerytoken


    【解决方案1】:

    这是不可能的。防伪令牌基于 Http Cookie 和表单中的隐藏值;执行 Action Redirect 时,该表单值会丢失,因此无法验证防伪令牌。

    你需要想出一个不需要动作重定向的设计......

    学分:-Roy Dictus

    How to pass through the AntiForgeryToken to another action

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多