#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 и как отправлять пакеты авторизации и аутентификации этим классом? Как получить байты запроса для генерации байта аутентификации по паре (домен пользователь, пароль)?