【问题标题】:UWP NTLM Authentication with Windows credentials使用 Windows 凭据的 UWP NTLM 身份验证
【发布时间】:2019-01-09 14:31:24
【问题描述】:

有很多示例,但所有示例都使用登录名和密码。我能找到的最好的默认凭据:

    byte[] type1Message = new byte[40]
    {
        // 'N',  'T',  'L',  'M',  'S',  'S',  'P',  '\0'
           0x4E, 0x54, 0x4C, 0x4D, 0x53, 0x53, 0x50, 0x00,
        // Type 1 message
           0x01, 0x00, 0x00, 0x00,
        // Flags
           0x97, 0x82, 0x08, 0xe2,
        // Supplied Domain
           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        // Supplied Workstation
           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        // OS Version Structure
           0x0A, 0x00, 0x39, 0x38, //0x00, 0x00, 0x00, 0x00,
        // Os version uknown
           0x00, 0x00, 0x00, 0x0f
    };

    var handler = new HttpClientHandler();
    handler.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
    handler.AllowAutoRedirect = true;
    var _client = new HttpClient(handler);
    var request = new HttpRequestMessage(HttpMethod.Get, server.Url);
    request.Headers.Add("Authorization", "NTLM " + Convert.ToBase64String(type1Message));
    var message = _client.SendAsync(request);

这里我只得到 type1Message。有什么方法可以获取 type2Message 和 type3Message 或者是否有一个现成的库?

【问题讨论】:

    标签: authentication uwp ntlm


    【解决方案1】:

    有很多示例,但所有示例都使用登录名和密码。

    这是 NTLM 工作的唯一方式,除非您在 Windows 上并且您实际使用本机 Windows 身份验证 API(InitializeSecurityContextAcceptSecurityContext 等)。

    NTLM 的工作原理是计算用户登录密码的哈希值,并将其用作输入来创建对服务器质询的响应。此功能需要明文密码,这就是为什么您会看到带有用户名和密码的示例。

    那么默认凭据在 Windows 上是如何工作的呢?好吧,当用户登录机器时,会根据他们输入的密码生成 NTLM 哈希。 (使用 Windows Hello?这很酷,在这种情况下,哈希会生成并存储在硬件的安全上下文中,并在您以这种方式登录时检索。)

    您将无法从操作系统中获取哈希值,因此您需要提示输入用户名和密码,并将其提供给您的非本地 NTLM 函数,或者调用本地 Windows与您的语言的 FFI(PInvoke、JNI 等)一起使用。

    【讨论】:

    • 现在我看到了 UWP 标签,我突然想到 UWP 可能 确实 具有使用默认凭据的一些功能(但手动设置标头可能无济于事)。我将把它留在这里,但我怀疑其他人可以提供比“使用InitializeSecurityContext.
    • 谢谢爱德华。目前我使用Windows。如果我理解正确,默认凭据必须让我无需用户输入登录名和密码即可登录。这意味着某种系统 API 应该计算密码哈希和/或关注整个过程。
    • 这是正确的 - 我怀疑在 Windows 上使用 UWP 可以做到这一点,但我对那个堆栈不是很熟悉。使用 C 语言中的 WinHttp 或使用 .NET HTTP 堆栈相当容易。所以我怀疑你有一个解决方案,当有更多知识的人提供解决方案时,我会很乐意删除这个答案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2016-03-24
    相关资源
    最近更新 更多