我们在身份验证控制器中有一个登录方法,如下所示:
[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");
}
它应该回到原始的 Login 方法,并且证书将在标头中准备好进行身份验证,以便我们可以测试它是否有效。
问题是重定向到路由结果不能是帖子。我怎样才能做到这一点? 有人知道吗?
这对我有用:
[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);
}