问题标签 [sspi]
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.
sql-server - sspi 用户的最佳实践
我目前正在为 3 个 mvc web 应用程序设置 web 和 sql windows 服务器。我已经设置了一个 sspi 域用户,但不熟悉正确和最优化的设置。
是否所有应用程序池都与该用户一起设置?sql server 上的所有数据库是否都获得该用户的读/写权限?
我正在寻找与 sspi 用户合作时的最佳实践。
winapi - 通过用户名通过 SSPI 检索 Kerberos 令牌
有没有办法在没有密码的情况下在本地检索用户令牌?
wcf - 除非客户端和服务器使用相同的 Windows 身份,否则带有 sspi 的 WCF Net.tcp 会失败
我有一个由 Windows 服务托管的WCF服务。如果我使用与运行服务相同的凭据登录客户端计算机,则客户端应用程序成功,但如果我使用任何其他有效域帐户登录,它会失败并出现异常。
我有两个正在测试的帐户,一个是普通用户帐户,另一个帐户是管理员帐户。我已经尝试了下面列出的所有四种组合:
如您所见,这不是管理员问题,因为当客户端和服务器都在非管理员帐户下运行时,系统可以正常工作。在这两种失败的情况下,我都会在客户端上遇到相同的异常,但没有任何迹象表明服务器日志中发生了任何事情:
“对 SSPI 的调用失败。请参阅内部异常”
内部异常是“目标原则名称不正确”。
我已将这些帐户注册为 SPN。
该问题仅在我的客户端应用程序中出现,但在我使用WCVFTestClient.exe
Visual Studio 附带的应用程序时不会出现。
WCF 跟踪日志中的异常是
“System.ServiceModel.Security.SecurityNegotiationException,System.ServiceModel,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089”
留言:
“远程身份验证失败(流可能仍可用于其他身份验证尝试)。”
堆栈跟踪位于底部:出了什么问题?
堆栈跟踪
System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeAcceptor.OnAcceptUpgrade(Stream stream, SecurityMessageProperty&remoteSecurity) System.ServiceModel.Channels.StreamSecurityUpgradeAcceptorBase.AcceptUpgrade(Stream stream) System.ServiceModel.Channels.InitialServerConnectionReader.UpgradeConnection(IConnection connection, StreamUpgradeAcceptor upgradeAcceptor, IDefaultCommunicationTimeouts defaultTimeouts) System.ServiceModel.Channels.ServerSessionPreambleConnectionReader.ServerFramingDuplexSessionChannel.OnOpen(TimeSpan timeout) System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) System.ServiceModel.Dispatcher.ChannelHandler.OpenAndEnsurePump() System.Runtime.ActionItem.DefaultActionItem.TraceAndInvoke() System.Runtime.ActionItem.CallbackHelper。InvokeWithoutContext(对象状态) System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) System.Threading._IOCompletionCallback .PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)本机重叠* pOVERLAP)本机重叠* pOVERLAP)
c++ - 如何在 Windows 上使用来自 SSPI 的委托凭证创建ProcessAsUser?
我在 Kerberos 登录基础架构(单点登录)上工作:
- 经过 Kerberos 密钥分发中心身份验证的客户端。
- 使用 Kerberos 作为身份验证的主体服务服务器。
服务器程序是用 C++ 编写的。
在我的主体(客户端)和我的服务主体(服务器)之间创建上下文没有问题。我还将客户端凭据委托给服务器,因为我需要使用客户端用户凭据在服务器上创建一个进程。
这是我的问题,在服务器端,我有一个 SSPI 上下文,我需要使用 Windows 类型 CreateProcessAsUser pHandle
。
我不知道如何使用我的 SSPI 凭据在我的服务器上创建一个作为客户端用户的进程。
我看一下 LsaLogonUser,它似乎做了我想做的事(从 kerberos 用户凭据创建句柄),但我的问题是一样的,我不知道如何将 SSPI 令牌与这个 LsaLogonUser 一起使用。
在此先感谢您的帮助
c# - 客户端-服务器身份验证 - 使用 SSPI?
我正在开发一个客户端-服务器应用程序,我希望客户端使用用户的登录凭据对服务器进行身份验证,但我不希望用户必须输入他们的用户名和密码。我当然不想负责安全地处理密码。我只需要用户向我证明他们是他们所说的人,然后我的服务器可以继续并根据需要授予/拒绝命令。
我的用户是域的一部分,因此我希望能够使用他们在登录时创建的登录凭据。
我没有使用任何类型的网络服务,也不想使用。我控制客户端和服务器软件,两者都是用纯 C# 编写的,并使用良好的 ol' 套接字来完成工作。
我更喜欢使用纯 C#/.Net 来执行此操作,但如果这意味着我会完成工作,我愿意使用不安全的 C# 和 pinvokes 到 win32 API。
我已经阅读了一些关于 Windows 中的 SSPI 的信息,但我有点摸不着头脑,因为这种应用程序开发对我来说是新的。
有人知道怎么做这个吗?是 SSPI 的方式吗?如何在 C# 中使用 SSPI?有没有一种 .Net-native 方式可以让我的代码保持可移植性?
curl - 使用 SSPI 进行 Kerberos 身份验证
注意:我设法取得了一些进展,请参阅我当前问题的编辑,谢谢。
我想在 Windows 上使用 libcurl 来访问具有 Kerberos/GSSAPI 身份验证的网站。我首先尝试使用 MIT Kerberos 解决它,但我还需要使用 SSPI 进行 NTLM 身份验证(libcurl 不支持同时使用来自两个不同实现的两者)。所以我希望使用 Windows SSPI 库在 Kerberos 中进行身份验证。我设法编译了带有 SSPI 和 SPNEGO 支持的 libcurl。
现在我的问题是我需要使用提供的凭据连接到任何提供的领域(它可能是当前用户的领域或其他用户的领域)。据我了解,我需要从 secur32.dll/security.dll 调用 AcquireCredentialsHandle 和 InitializeSecurityContext 来检索 Kerberos 票证。
但每次我试图让它发挥作用时,我:
- 不要从 SSPI 缓存中提供的凭据/领域的 DC 获取任何票证(我正在使用 kerbtray.exe 来查看条目)。
- 使用这些方法时,我应该在此缓存中看到一张票吗?
- 在调用 ImpersonateSecurityContext 和 InitializeSecurityContext/AcceptSecurityContext 的客户端/服务器环回并查看 Wireshark 中的数据包后使用 libcurl,我看到 libcurl 不使用任何提供的凭据并回退到 NTLM(这只会导致身份验证失败)
- 环回客户端/服务器是正确的行为吗(我在网上找不到任何其他实现的例子)?
- 假设模拟成功,libcurl 是否应该使用线程的模拟凭据?
- libcurl 是否完全支持带有 SSPI 的 NTLM + Kerberos(我什至不确定......)?
为了方便调试和测试,你知道有什么工具可以在 SSPI 缓存中添加一个条目,比如 MIT Kerberos 库中的 kinit 吗?我正在使用 Windows Server 2003 资源工具包工具,但找不到任何此类工具...
任何帮助将不胜感激 !
编辑
好吧,我发现了如何使用 libcurl 制作我想要的东西。最后我假设我必须事先对 SSPI 做一些工作,但 curl 正确地支持了这一点。
当使用带有 SSPI 和 SPNEGO 标志的正确构建版本的 curl 时,curl 将对 kerberos 领域进行身份验证并将其存储在 LSA 缓存中。
使用 curl.exe 进行测试时,您需要指定--negotiate参数以及用户名/密码。但是,在使用 libcurl 时,只需将 CURLOPT_HTTPAUTH 选项设置为包含 CURLAUTH_GSSNEGOTIATE 的任何内容(例如 CURLAUTH_ANY)。在我的测试中,libcurl 完成了预期的 Kerberos握手:
- 联系 Web 服务器(web.b.com,其中 B.COM 是 Web 服务器的 kerberos 领域)
- 收到未经授权的答案,WWW-Authenticate参数设置为协商
- Libcurl/SSPI 将 TGS-REQ 发送到当前用户所在域的域控制器 (DC)(比如说 A.COM)
- 不知何故,下一个 TGS-REQ 被发送到 Web 服务器 (B.COM) 的域控制器
- 收到域 B.COM 的 Kerberos 票证并在 LSA 缓存中添加条目(可通过 klist.exe 或 kerbtray.exe 查看)
- Libcurl 使用授权信息(GSS-API)向 Web 服务器发送 HTTP 请求
但是,这是我的新问题,所有这些握手都是使用当前记录的凭据进行的,比如user1@A.COM。由于 A.COM 和 B.COM 之间存在信任,并且我的用户可以访问,因此它可以工作。我宁愿使用提供的凭据 ( user2.B.COM ) 登录?
另外,我不太确定是否可以在与当前登录的用户不同的用户的 LSA 缓存中添加一个条目?
如何通过模拟用户user2.B.COM以使 libcurl 可以访问与该用户关联的票证以对 Web 服务器进行身份验证来完成这项工作?
python - pyCurl 检查是否启用了 SSPI
据我了解,默认版本pycurl
不支持SSPI
,并且是针对非常旧版本的 libcurl ~ 7.19 构建的。所以我已经着手构建了我自己的这个库。
我已经在我的机器上安装了新的libcurl
和pycurl
源代码,并且版本信息确认它已经正确构建。使用 WINDOWS_SSPI 标志。
libcurl 版本现在显示为 7.31.0。但我看不到是否启用了 SSPI。从 pycurl 运行版本信息给了我。
但仍然没有迹象表明 SSPI 是否已启用。
imap - 如何使用 NTLM 身份验证访问共享邮箱
我正在尝试使用 IMAP 访问 Exchange 中的共享邮箱,但我不想将密码存储在应用程序中,因此我尝试了 NTLM 身份验证。
我能够使用 SSPI 框架 api 进行身份验证,但现在我正在努力选择共享收件箱。
使用“基本”身份验证我知道我可以做到:
这确实工作正常,但我不想在我的应用程序中存储密码,所以我使用 NTLM 身份验证(连接到存储邮箱别名的 exchangeserver1.domain.com):
当前上下文用户邮箱存储在 exchangeserver2 中,但共享邮箱在 exchangeserver1 中,这就是为什么在 NTLM 中您会看到 REFERRAL 部分,但在上述两种情况下,我都连接到 exchangeserver1。
我尝试了几种select
带有“邮箱别名”和“收件箱”的命令变体,但都没有奏效。我确实可以访问邮箱,我是它的所有者,我可以从 Outlook(但我相信它使用 MAPI)和“基本身份验证”访问它。
认证后,如何选择共享邮箱收件箱?
我正在使用以下 AcquireCredentialsHandle 调用来生成 NTLM 类型 1 消息:AcquireCredentialsHandle (null, "NTLM", 2, 0, 0, 0, 0, ref phCredential, ref ptsExpiry)
我什至尝试将第一个参数(将是用户名)从 null(当前上下文用户)更改为“域/用户名/邮箱”,但它不起作用。
谢谢 :)
apache - NGINX => APACHE + SSPI
我们有一个具有 sspi 授权的 apache 服务器。我们正在使用 mod_auth_sspi。现在我们需要通过 nginx 在另一台服务器上代理我们的 api。主要问题是如何使 NTLM(我正确理解 mod_auth_sspi 使用它)通过 NGINX 工作。我猜我们需要代理 Authorization 标头。但我不知道怎么做。
PS:或者也许有人知道 nginx 的 mod_auth_sspi 模拟?
PS:Ubuntu 12.04下的NGINX服务器,apache + sspi - Windows下的Wamp
kerberos - 带有 Kerberos 的 SPN 如何工作
据我了解,
- SPN 是 Windows 服务的身份验证工具。
- Kerberos 是一种用户身份验证服务
- SPNEGO-GSSAPI 是能够使用这些服务的第三方 API。
- SSPI :是从 SPNEGO 向 SPN 服务发送请求的中立层。
我完全迷路了吗?
试图弄清楚它是如何工作的,但信息要么太精确,要么不够。