使用协商身份验证的 ASP.NET Core 6 应用程序中出现握手错误

问题描述 投票:0回答:1

我有一个 ASP.NET Core 6 应用程序,它使用

Negotiate
身份验证方案来使用 Windows 身份验证 (NTLM/Kerberos) 进行身份验证。

我正在这样配置身份验证服务:

services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();
    
services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder(NegotiateDefaults.AuthenticationScheme)
        .RequireAuthenticatedUser()
        .Build();
}

这在我的本地开发计算机上可以正常工作,但是当我尝试将其部署到生产服务器时,出现了问题。

特别是,部署后,如果我尝试调用标有

[Authorize]
的端点,浏览器会正确显示登录提示,但在输入我的凭据后,后端会响应通用 500 错误。

我注意到的一件重要的事情是,如果我尝试通过

https://localhost
访问从服务器本身访问应用程序,身份验证会起作用,但如果我使用机器完整的机器 URL,例如:
https://myserver.domain.local
,则不会工作时我收到 500 错误。

那么这可能与网络代理或类似的东西有关?我怎样才能正确调试这个?我尝试将所有日志记录设置为“调试”级别,这就是我收到错误时看到的内容:

连接 ID“0HN6OHVHNEJKS”,请求 ID“0HN6OHVHNEJKS:00000007”:应用程序引发了未处理的异常。

System.InvalidOperationException:在身份验证握手请求之间收到匿名请求。

在 Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler.HandleRequestAsync()
在 Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler.HandleRequestAsync()
在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文)
在 Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext 上下文)
在 Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext 上下文)
在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.g__Awaited|6_0(ExceptionHandlerMiddleware 中间件、HttpContext 上下文、任务任务)
在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.HandleException(HttpContext 上下文,ExceptionDispatchInfo edi)
在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.g__Awaited|6_0(ExceptionHandlerMiddleware 中间件、HttpContext 上下文、任务任务)
在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 应用程序)

堆栈跟踪似乎表明我在握手期间执行其他连接,但我检查了浏览器网络面板,并且没有任何额外的待处理连接。

有什么想法吗?

c# asp.net-core authentication .net-6.0 windows-authentication
1个回答
0
投票

好吧,我想通了。显然,如果您在域中并且将应用程序作为 Windows 服务自行托管,则需要运行此命令,否则服务用户无法对调用进行身份验证:

setspn -s HTTP/mymachine.mydomain.local mydomain\serviceuser

此后,它就可以正常工作了。

有趣的是,有关该主题的官方Microsoft文档说这仅在macOS/Linux环境中是必要的,但我在Windows Server上仍然需要这样做。

© www.soinside.com 2019 - 2024. All rights reserved.