如何处理部署在Kestrel上的asp.net核心mvc中弹出的windows身份验证取消按钮



我正在尝试在asp.net核心mvc应用程序中实现混合身份验证windows+cookie。当取消windows身份验证时,我想将用户重定向到回退页面,在该页面上可以选择基于windows或cookie的身份验证。该应用程序将部署在Kestrel而不是IIS上。我使用的是.net核心3.1。

基本上,当http状态代码为401,子状态代码为1或2时,我需要在回退页面上重定向用户。

到目前为止,我尝试使用状态代码页作为休耕:

在Startup.cs中,我添加了

app.UseStatusCodePagesWithReExecute("/Error/Status", "?statusCode={0}");

在ErrorController.cs 中

public IActionResult Status(int statusCode)
{
var statusCodeReExecuteFeature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
if (statusCode == 401)
{
return RedirectToAction("Index", "Fallback");
}
var originalURL =
statusCodeReExecuteFeature.OriginalPathBase
+ statusCodeReExecuteFeature.OriginalPath
+ statusCodeReExecuteFeature.OriginalQueryString;
return Redirect(originalURL);
}

这不起作用,因为它破坏了windows身份验证握手。

我还尝试实现自定义错误处理程序并检查HttpResponse.StatusCode==401,但错误控制器方法没有命中,可能是因为windows身份验证由另一层处理。。

过了几天,我几乎觉得这是不可能的。但最终我想明白了。我的问题是在Identity Server 4上执行外部身份验证时。当用户点击"时,我无法捕捉到事件;取消";。我得到了401状态码,用于进入Windows身份验证,用于点击";取消";并且当点击";Signin";。解决方案如下:将此行放在Startup.cs中的public void Configure(IApplicationBuilder应用程序):中

app.UseStatusCodePagesWithReExecute("/external/ErrorPage", "?statusCode={0}");

之后,只需在控制器中创建一个IActionResult函数,如下所示:

[HttpGet]
public IActionResult ErrorPage(int? statusCode = null)
{
if (statusCode.HasValue)
{
return View(new SomeViewModel() { ErrorMessage = statusCode.Value.ToString()});
}
return View();
}

最新更新