我们在身份验证控制器中有一个登录方法,如下所示:
[HttpPost, ValidateModelState]
public ActionResult Login()
{
var certificateName = GetCertificate();
GetCertificate()如下所示:
public string GetCertificate()
{
var headerCertificateValue = Request.Headers.Get("X-ARR-ClientCert");
return headerCertificateValue;
基本上我们在标头中使用证书进行身份验证。所以现在我们正在尝试测试cert头是否可行。
我有一个看起来像这样的表单来模拟我们的证书服务机制:
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方法,并且证书将在标头中准备好进行身份验证,以便我们可以测试它是否有效。
问题是RedirectToRouteResult不能是帖子。 我怎样才能做到这一点?有谁知道吗?
答案 0 :(得分:0)
这对我有用:
[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);
}