我想设置一个 Web 服务器,以便它允许独占进行 Kerberos 身份验证(无 NTLM)。我正在将 ASP.NET Core (Blazor) 与 HTTP.sys 结合使用。
我已成功设置服务器和客户端,以便当我使用“协商”方案时 Kerberos 身份验证可以正常工作:
builder.Services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);
builder.WebHost.UseHttpSys(options =>
{
options.Authentication.Schemes = AuthenticationSchemes.Negotiate;
options.Authentication.AllowAnonymous = false;
options.UrlPrefixes.Add("http://+:80/AuthTest");
});
我已设置 SPN 和客户端信任站点。当我在客户端浏览到
http://myhost.my.domain/AuthTest
时,它验证成功。使用 Wireshark,我已确认使用了 Kerberos 身份验证,相应的票证也在客户端计算机上显示为 klist
。
但是,当我更改设置中的一行以使用
Kerberos
身份验证方案而不是 Negotiate
时:
options.Authentication.Schemes = AuthenticationSchemes.Kerberos;
我无法再进入我的网站 - 浏览器显示 401 错误页面。
在我的原始设置中,服务器使用 401 状态代码和
WWW-Authenticate=Negotiate (...)
标头响应初始请求,之后浏览器向 KDC 请求 Kerberos 票证,并使用 WWW-Authorization
标头向我的服务器重复请求。一切都好。
将身份验证方案更改为
AuthenticationScheme.Kerberos
后,服务器会响应 401 和 WWW-Authenticate=Kerberos
标头,浏览器似乎会忽略该标头 - 它不会发送任何后续请求,也不会联系 KDC。
我无法找到任何有关将“Kerberos”作为 WWW-Authenticate 标头的值发送的文档(我只找到了“Negotiate”文档)。然而,HTTP.sys 预定义了这个选项,并发送这样的标头,浏览器似乎会忽略该标头。
所以,我的问题是:将“Kerberos”作为 WWW-Authenticate 标头的值发送是否有效(浏览器可以理解它)?如果是这样 - 我必须在设置中更改哪些内容才能使其正常工作(或者我应该提供哪些附加信息)?如果不是 - 可以通过 HTTP 实现仅 Kerberos 身份验证吗?