具有Windows凭据的UWP NTLM身份验证

时间:2019-01-09 14:31:24

标签: authentication uwp ntlm

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

    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,或者有准备就绪的库?

1 个答案:

答案 0 :(得分:0)

  

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

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

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

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

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