问题标签 [http-negotiate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
16527 浏览

kerberos - linux docker容器中的Windows身份验证

我正在尝试在 kubernetes 下的 linux docker 容器中使用 windows 身份验证。

我正在关注此设置:https ://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-3.1&tabs=visual-studio#kestrel

应用程序位于 .net core3 中,使用 nuget Microsoft.AspNetCore.Authentication.Negotiate 并在 kestrel 中运行

我添加了

并将我的 devbase 映像设置为

tfs 管道中的构建创建从上面派生的应用程序 docker 映像并添加以下环境变量,还将构建复制到 /app

该应用程序由 run.sh 运行

klist 列出已将 SPN 分配给机器的主体

在 ie 和 firefox 中,我已将 network.negotiate-auth.trusted-uris 添加到我的应用程序中

但是我得到了登录对话框,但没有成功登录

所以问题是:

如何使用 Microsoft.AspNetCore.Authentication.Negotiate 包启用调试日志?

我的假设是这个包不能正确地与 kerberos 通信,也许某些包丢失了,没有运行或什么的。

另请注意,容器和 .net 应用程序已成功连接到域,因为我使用集成安全性连接到有效的数据库。

**** 编辑 > 回答第一部分

要启用日志,应该在 kestrel 中启用日志:在 appsettings.json 中:

在 program.cs 中:

在 Startup.cs 中可以跟踪协商事件:

**** 编辑

同时,根据我在 .net core docker web 应用程序中允许 windows 身份验证的目标,我正在浏览 .net core 和 corefx 的源代码,并将身份验证代码压缩到这个示例控制台应用程序中:

所以我发现该库与 System.Net.NTAuthentication 通信,后者与 System.Net.Security.NegotiateStreamPal通信, 后者与 unix 版本的 Interop.NetSecurityNative.InitSecContext通信

这应该以某种方式触发操作系统中的 GSSAPI

在 dotnet runtime git 中,他们告诉我们 gss-ntlmssp 需要它才能工作,即使在 aspnet 核心文档中无论如何都没有提到它。

https://github.com/dotnet/runtime/issues?utf8=%E2%9C%93&q=gss-ntlmssp

尽管如此,我已经编译了 gss-ntlmssp 并发现如果没有这个库,它会抛出错误“请求了不支持的机制。 ”。对于我的库,它会抛出错误“没有提供凭据,或者凭据不可用或无法访问。 ”,但永远不会访问任何 gss_* 方法。

我通过将日志条目添加到从未发生过的文件中测试了 gss 方法的使用.. fe:

所以.net调用gssapi,而gssapi不调用机制。

我在 centos7 vm、ubuntu windows 子系统和 debian docker 映像(自定义 mcr.microsoft.com/dotnet/core/sdk:3.1-buster)中观察到了相同的行为

所以现在的问题是,我该如何调试 gssapi ?

我假设我当前的 gssapi 由这个库管理:

到目前为止,我已经从 mit 源编译了新的最新 gssapi,发现它向我抛出了错误“请求了不受支持的机制”。因为 gssapi 需要未提供的 gss 解释器。在 centos7 中,我遇到了另一个问题,即 openssl 库正在使用不兼容的共享 kerberos 库,因此 yum 停止工作。

*** 编辑

我发现 gss-ntlmssp 具有标志 GSS_C_MA_NOT_DFLT_MECH 因此失败并显示消息“未提供凭据,或者凭据不可用或无法访问。”。解决方案是构建没有此属性的自定义 gss-ntlmssp,因为我希望将其用作默认身份验证机制。

我的用于检查凭据的示例控制台应用程序现在可以正常工作,我现在将尝试将其放入 docker 容器中。

*** 编辑

我能够在 kubernetes 中成功运行我的 ConsoleApp:

在此处输入图像描述

但是,我现在收到此错误:

*** 编辑现在它在这里失败了:gssntlm_init_sec_context.. gssntlm_acquire_cred.. gssntlm_acquire_cred_from..

get_user_file_creds() 返回错误,因为我没有特定的文件设置,因为我想从广告中验证用户

external_get_creds() 在这里失败:

external_get_creds 尝试使用 winbind 库进行身份验证,显然在凭据缓存中没有用户存在

我设法用 samba 提供的 winbind 库编译它

所以现在的问题是: 如何设置 winbind 库与 AD 通信?

*** 编辑

我曾尝试在 github 上使用 .net 5,有人告诉我 NTLM 在 .net 5 中工作。但是我得到的结果与使用 .net 3.1 相同。

我尝试过的Docker镜像:

在 docker 容器中:

在此处输入图像描述

在此处输入图像描述

我已将自己的调试信息放入 gssntlmssp 库中,并将其放入文件中

在此处输入图像描述

这与我完成 .net core 3.1 的结果完全相同。

wbcCredentialCache (samba lib) 在找不到缓存的凭据时失败

这是我的 krb5.conf:

和 samba 文件的一部分:

在我看来,我更希望拥有 NTLM 然后协商,因为据我所知,浏览器不支持协商。例如,在 Firefox 中,该人必须为协商服务器设置 about:config。不支持通配符,...

尽管如此,我似乎无法使用 ntlm 运行 .net core 5 Web 应用程序,所以我现在将尝试在没有 gssntlmssp 库的情况下使用一些默认的 kerberos 机制来设置它。知道我的 krb5.conf 设置有什么问题吗?

****编辑所以我现在尝试两种不同的方法:

  1. NTLM - 我认为这是更可取的方式,因为我已经看到 ntlm 在 iis express 中验证用户,例如没有对话框,并且不需要在 firefox 中或通过组策略进行任何特殊配置(如果我错了,请纠正我)
  2. 谈判

关于谈判,我设法取得了一些进展。

使用这个 docker 容器,我能够绕过不受支持的机制:

但是现在我有其他问题: Request ticket server HTTP/is.k01.mydomain.com@MYDOMAIN.com kvno 3 found in keytab but not with enctype rc4-hmac

在我看来,keytab 不是 rc4-hmac,这是真的,因为 keytab 是用

正如 .net 文档所说。

我无法禁止使用 rc4-hmac 并且只允许使用较新的编码,所以我要求我的基础设施部门使用旧的 rc4-hmac 编码生成新的密钥表。

这一步让我更进一步,我得到了这个错误:Request ticket server HTTP/is.k01.mydomain.com@MYDOMAIN.COM kvno 4 not found in keytab; keytab 可能已过时*

这很奇怪,因为 keytabs 不能过期,密码没有更改,并且在一小时前生成 keytab 时 100% 有效,并且网络上没有信息 - “kvno 4 not found in keytab”仅获取 4结果在谷歌。

**** 编辑

所以最后我设法让它工作了:)

“kvno 4 not found in keytab”的问题是在 krb5.conf 文件中,我赞成强制 aes 加密我已经添加了行

在我将它们注释掉之后,使用 Negotiate 的身份验证就开始起作用了。我已经用 .net 5 测试了 NTLM,但它仍然无法正常工作。

krb5.conf 文件在 docker 容器中进行协商,如上述构建工作:

所以现在的问题是:有什么方法可以让许多服务运行协商协议而不将每个服务添加到 spn 并手动设置浏览器?

因此,目前每个新的 Web 服务都必须具备:

并且必须在 Internet Explorer > 设置 > 安全 > 网络 > 详细信息 > 域中列出

我认为互联网浏览器设置应该可以通过域组策略以某种方式更新..有人知道怎么做吗?

**** 编辑我已经在域中测试了通配符以在浏览器中进行协商设置,结果如下:

  • :支持 *.k01.mydomain.com
  • :支持 *.k01.mydomain.com
  • firefox(73.0.1(64 位)):不支持 *.k01.mydomain.com - 仅支持完整域,例如 is.k01.mydomain.com
  • 边缘44.18362.449.0 - 不知道为什么,但没有一个 ie 设置被传播.. 不适用于 *.k01.mydomain.com 和 is.k01.mydomain.com

**** 编辑我已经开始使用带有协商的win auth,但是我现在在.net core中遇到了一些问题

IIS express 下的这段代码以 MYDOMAIN\myuser 的形式显示用户:

在 linux 中显示为 myuser@mydomain.com

IIS express下的User.Indentities.First()是WindowsIdentity,我可以列出用户的所有组

Linux下的User.Indentities.First()是没有组信息的ClaimsIdentity

当我尝试在 IIS Express 中使用组限制它时,我得到:

Linux kestrel 与协商:

因此,kestrel 中的协商似乎没有正确列出组。所以我现在要调查,如何在 kestrel 中获取 WindowsIdentity

0 投票
0 回答
187 浏览

google-chrome - Chrome/Edge 中的 Windows 身份验证出现问题 HTTP 请求未经授权...从服务器收到的身份验证标头是 Nogotitate、NTLM

我在 Web 客户端调用 WCF 服务时遇到问题。

错误信息

HTTP 请求未经客户端身份验证方案“协商”的授权。从服务器收到的身份验证标头是“协商,NTLM”...

我可以说,除了德国的员工,公司的所有员工都没有遇到这个问题。

有趣的是,当我问德国的工作人员试图用新的隐身标签浏览网站时,他输入了他的 Windows 身份验证并且它工作......但是普通的 Chrome/Edge 不能工作......Firefox 完美运行。

一个奇怪的事情是当他在 Firefox 中浏览网站时,例如

http://test.com/abc.html

他回到 Chrome/Edge,尝试浏览http://test.com/abc.html --> 它可以工作 :)) 甚至在此之前它在 Chrome/Edge 中不起作用......听起来他必须暖和在使用 Chrome/Edge 浏览该 url 之前使用 Firefox 设置一个 url...

我让他清理他的 Chrome,但它也不起作用。我不认为这是因为网站或 wcf 配置,因为它已经运行了很长时间,而且除了德国人之外,很多人都在正常使用它。

有没有人遇到过这个问题,或者你能给我一些解决这个问题的想法吗?

非常感谢,