我用。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标题下有更多信息。网络核心