我有一个这样的表格:
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 attrubute会破坏它。
答案 0 :(得分:0)
这是不可能的。防伪令牌基于Http Cookie和表单中的隐藏值;在执行动作重定向时,该表单值将丢失,因此无法验证防伪标记。
您需要提出一个不需要动作重定向的设计......
信用:-Roy Dictus