“Kerberos”可以在 WWW-Authenticate 标头中传递吗?

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

我想设置一个 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 身份验证吗?

authentication http kerberos httpsys
1个回答
0
投票

是和不是。

Kerberos
作为一种机制用于一些基于HTTP的协议,例如WinRM/WS-Man(PSRemoting的主要传输——这可能就是为什么HTTP.sys将其作为一个选项——但它不用于常规“网络浏览器”HTTP。

使用

Negotiate
时,所有浏览器都更喜欢 Kerberos 而不是 NTLM。在服务器端,如果应用程序“检测到已使用 NTLM”,则在身份验证后手动返回 401 就足够安全了。 (如果您出于安全原因想要阻止发送 NTLM 令牌,则需要在客户端进行限制,而不是在服务器端。)

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