现在使用WinHTTP,并希望切换到cpprestsdk。我正在浏览文档,但没有看到有关NTLM / Negotiate / Kerberos支持的任何信息。我想念什么吗?我很难相信MS不会支持它,但是我看不到任何有关如何使用它的示例代码。
我们需要NTLM / Negotiate / Kerberos支持的原因是,我们正在通过RemoteApp运行客户端,并且希望我们的用户在启动应用程序时只需使用其域凭据登录一次,而不会提示用户输入密码第二次。
答案 0 :(得分:0)
卡萨布兰卡(CpprestSDK
)完全支持NTLM
身份验证。如果服务器拒绝状态代码401/403和标头WWW-Authenticate
的请求,则库将使用最安全的身份验证方法在内部进行处理。对于NTLM
,您可以基于调用线程当前用户令牌来指定登录名/密码对,或使用自动登录(Windows)。
但是,当我尝试使用自动登录功能时,它在某些工作站上意外失败(Don Pedro回答中的情况1)。
Windows版本的Cpprest内部使用WinHTTP
。当您尝试在远程服务器上自动进行身份验证时,automatic logon policy生效。
自动登录(自动登录)策略确定何时 WinHTTP可以接受,以将默认凭据包含在 请求。默认凭据是当前线程令牌 或会话令牌,具体取决于是否在Windows中使用WinHTTP 同步或异步模式。线程令牌用于 同步模式,会话令牌用于异步模式。 这些默认凭据通常是用于 登录到Microsoft Windows。
默认安全级别设置为WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM
,它仅允许 Intranet 服务器自动登录。 Windows Internet选项对话框中定义了管理Intranet / Internet服务器分类的规则,有些模糊(至少在我们的情况下)。
为了确保正确的自动登录,我使用请求本机处理程序配置将安全级别降低到WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW
:
web::http::client::http_client_config make_config()
{
web::http::client::http_client_config config;
config.set_proxy(web::web_proxy::use_auto_discovery);
if (!m_wsUser.empty()) {
web::credentials cred(m_wsUser, m_wsPass);
config.set_credentials(cred);
}
config.set_nativehandle_options([](web::http::client::native_handle handle) {
DWORD dwOpt = WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW;
WinHttpSetOption(handle, WINHTTP_OPTION_AUTOLOGON_POLICY, &dwOpt, sizeof(dwOpt));
});
return config;
}
在我来说,这种方法是可以接受的,因为服务器和客户端始终在组织网络边界内。否则,此解决方案是不安全的,并且不应使用。