Реализация пользовательского согласования AuthenticationManager

#c# #.net

#c# #.net

Вопрос:

Я пытаюсь реализовать простое приложение с полностью настроенным согласованием (или NTLM) на основе C #, которое послужит мне основой для более сложного проекта, такого как imckaet на python. На данный момент мне нужно написать пользовательский согласованный (или NTLM) AuthenticationManager.

В документе Microsoft я узнал, что AuthenticationManager может это сделать, и там найдена простая customb BasicAuthentication, но я хочу реализовать свой CustomNegotiate.

Я реализую метод аутентификации следующим образом:

 public Authorization Authenticate(String challenge, WebRequest request, ICredentials credentials)
    {
        NetworkCredential MyCreds = credentials.GetCredential(request.RequestUri, "Ntlm");
        if (PreAuthenticate(request, credentials) == null)
            Console.WriteLine("n Pre-authentication is not allowed.");
        else
            Console.WriteLine("n Pre-authentication is allowed.");

        bool challengeOk = checkChallenge(challenge, MyCreds.Domain);

        if (!challengeOk)
            return null;

        // authorization.
        string neg = create_NTLM_NEGOTIATE_MESSAGE(MyCreds.UserName);
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(request.RequestUri);
        request.ServerCertificateValidationCallback  = (sender, certificate, chain, sslPolicyErrors) => true;
        request.Method = "GET";
        request.Headers.Add("Authorization", "Negotiate "   neg);
        HttpWebResponse resp;
        byte[] server_challenge = new byte[8];
        try
        {
            resp = (HttpWebResponse)req.GetResponse();
            Console.WriteLine(resp.Headers.ToString());
        }
        catch (WebException ex)
        {
            resp = ex.Response as HttpWebResponse;
            string msg2 = resp.Headers["WWW-Authenticate"];
            string[] challeng_string = msg2.Split(' ');
            server_challenge = parse_NTLM_CHALLENGE_MESSAGE(challeng_string[1]);
        }
        string auth = create_NTLM_AUTHENTICATE_MESSAGE(server_challenge, MyCreds.UserName, MyCreds.Domain, MyCreds.Password);
        string NtlmToken = "Negotiate "   auth;//Convert.ToBase64String(ASCII.GetBytes(BasicEncrypt));

        Authorization resourceAuthorization = new Authorization(NtlmToken);
        return resourceAuthorization;
    }
 

Итак, мой вопрос заключается в том, что согласование работает как протокол запроса-ответа и

Запрос WebRequest

настолько ли он открыт и вызывается из HttpWebRequest, как я могу реализовать протокол на основе запроса-ответа с помощью AuthenticationManager и как отправлять пакеты авторизации и аутентификации этим классом? Как получить байты запроса для генерации байта аутентификации по паре (домен пользователь, пароль)?