使用Windows身份验证和cpprestsdk?

时间:2019-11-16 07:04:29

标签: c++ casablanca cpprest-sdk

现在使用WinHTTP,并希望切换到cpprestsdk。我正在浏览文档,但没有看到有关NTLM / Negotiate / Kerberos支持的任何信息。我想念什么吗?我很难相信MS不会支持它,但是我看不到任何有关如何使用它的示例代码。

我们需要NTLM / Negotiate / Kerberos支持的原因是,我们正在通过RemoteApp运行客户端,并且希望我们的用户在启动应用程序时只需使用其域凭据登录一次,而不会提示用户输入密码第二次。

1 个答案:

答案 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;
}

在我来说,这种方法是可以接受的,因为服务器和客户端始终在组织网络边界内。否则,此解决方案是不安全的,并且不应使用