authentication - 如何处理部署在 Kestrel 上的 asp.net core mvc 中的 windows 身份验证弹出窗口的取消按钮?

标签 authentication .net-core error-handling asp.net-core-mvc windows-authentication

我正在尝试在 asp.net core mvc 应用程序中实现混合身份验证窗口 + 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,但错误 Controller 方法未命中可能是因为 Windows 身份验证由另一层处理..

最佳答案

我花了几天时间才几乎认为它无法完成。但最后我想通了。
我的问题是在 Identity Server 4 上执行外部身份验证时。当用户单击“取消”时,我无法捕捉到该事件。我获得了 401 状态码,用于输入 Windows 身份验证、单击“取消”以及单击“登录”。解决方案如下:
将此行放在公共(public) void Configure(IApplicationBuilder app) 中的 Startup.cs 中:

app.UseStatusCodePagesWithReExecute("/external/ErrorPage", "?statusCode={0}");
之后,只需在 Controller 中创建一个 IActionResult 函数,如下所示:
[HttpGet]
        public IActionResult ErrorPage(int? statusCode = null)
        {
            if (statusCode.HasValue)
            {
                    return View(new SomeViewModel() { ErrorMessage = statusCode.Value.ToString()});
            }
            return View();
        }

关于authentication - 如何处理部署在 Kestrel 上的 asp.net core mvc 中的 windows 身份验证弹出窗口的取消按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60035884/

相关文章:

asp.net-mvc - 用于存储用户上次登录信息的良好设计模式是什么?

c# - 反射发射生成简单的继承

performance - dotnet core 2 由于恢复时间长而构建时间长

spring-mvc - Spring MVC和JDBC数据源

java - OpenSAML 如何检查 SAML 响应(签名/证书)是否确实来 self 的 IDP?

ssl - 无法登录私有(private) docker registry

WebApi 上的 AngularJS 和 OWIN 身份验证

c# - `gulp.watch` 阻塞执行 `dotnet run`

error-handling - 忽略JAVACC中的MSGTokenError

sql-server - TSQL : TRY CATCH error handling with logging errors into a table