【问题标题】:How can I do a RedirectToAction but as a POST instead of a GET?如何执行 RedirectToAction 但作为 POST 而不是 GET?
【发布时间】:2018-04-21 13:56:25
【问题描述】:

我们在身份验证控制器中有一个登录方法,如下所示:

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

GetCertificate() 看起来像这样:

public string GetCertificate()
{
    var headerCertificateValue = Request.Headers.Get("X-ARR-ClientCert");
    return headerCertificateValue;

基本上,我们在标头中使用证书进行身份验证。所以现在我们正在尝试测试证书头是否可以工作。

我有一个看起来像这样的表单来模拟我们的证书服务机制:

    using (Html.BeginForm("MockEcaCertLogin", "Authentication", new { area = "Login" }, FormMethod.Post))
    {
        @Html.ValidationSummary(true)
        @Html.AntiForgeryToken()
        <h1 class="bg-info">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 = "FirstLast" },
            })

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

        </div>
    }

这个帖子在这里:

[HttpPost, ValidateAntiForgeryToken]
public RedirectToRouteResult MockEcaCertLogin(string certName)
{
    Request.Headers.Add("X-ARR-ClientCert", certName);
    return RedirectToAction("Login");
}

这应该回到原始的登录方法,并且证书将在标头中准备好进行身份验证,因此我们可以测试它是否有效。

问题是 RedirectToRouteResult 不能是帖子。 我怎样才能做到这一点?有人知道吗?

【问题讨论】:

  • RedirectResult 总是发出一个 GET 请求。所以你不能用 RedirectToAction 发帖
  • 为什么要在请求中添加标头然后放弃它?迄今为止的尝试似乎是基于一些误解。
  • 为什么不在客户端设置标题,然后使用javascript提交表单,登录httppost操作方法?

标签: asp.net-mvc http-post redirecttoaction


【解决方案1】:

这对我有用:

        [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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2013-02-25
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2013-05-19
    • 2020-10-18
    相关资源
    最近更新 更多