Windows认证与.net 6(协商)不工作-我该如何调试?



我用。net 6创建了一个非常小的示例项目,并通过在启动时设置以下行来启用kerberos/ntlm身份验证:

services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();

这只是工作正常。我通过调用以下命令在控制器中获取所需的用户:

HttpContext.User.Identity?.Name

但是后来我想把这个行为集成到我们现有的应用程序中(基于aspnetzero框架),这里它不再工作了。HttpContext.User.Identity ?。Name为空-没有设置用户。当然,我们的应用程序注册了许多其他服务,其中一个额外的服务可能会破坏协商机制。

有没有人知道我该如何调试这个问题?AddNegotiate()"实际上改变了吗?

同时,在做了更多的研究之后,我注意到,在简单的工作示例中,我有一个"Authorization"头在HttpContext中使用类似"NTLM TlRMTVNTUAADAAAAGA…"的值在这个不工作的复杂例子中,我没有这个头-但我有一个"MS-ASPNETCORE-TOKEN"头值为"a1b57bcf-4708-440d-8f38-c541e1ae77b5"

是否缺少将MS-ASPNETCORE-TOKEN转换为授权字符串的组件?

编辑:

我发现MS-ASPNETCORE-TOKEN实际上与身份验证无关。我还发现我可以用以下方式注释我的控制器方法:

Authorize(AuthenticationSchemes = NegotiateDefaults.AuthenticationScheme)

这将以某种方式在此api上强制协商-不幸的是,到目前为止,它只在IIS Express中工作,而不是在IIS中。

当你在IIS中托管时,IIS为你处理Windows身份验证,但是你必须通过使用web来告诉它这样做。配置文件。例如:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="false" />
<windowsAuthentication enabled="true" />
</authentication>
</security>
</system.webServer>
</configuration>

在ASP中的Windows身份验证文档中的IIS标题下有更多信息。网络核心

最新更新