Подтвердить что ты не робот

HttpWebRequest с использованием обычной проверки подлинности

Я пытаюсь выполнить запрос аутентификации, который имитирует "основной запрос auth", который мы привыкли видеть при настройке IIS для этого поведения.

URL-адрес: https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2
(предупреждение: https!)

Этот сервер работает под UNIX и Java в качестве сервера приложений.

Это код, который я использую для подключения к этому серверу:

CookieContainer myContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2");
request.Credentials = new NetworkCredential(xxx,xxx);
request.CookieContainer = myContainer;
request.PreAuthenticate = true;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

(Я скопировал это из другого сообщения на этом сайте). Но я получаю этот ответ с сервера:

Подключенное соединение было закрыто: произошла непредвиденная ошибка отправить.

Думаю, я пробовал все возможные задачи, которые мои знания на С# могут мне предложить, но ничего...

4b9b3361

Ответ 1

Вы также можете просто добавить заголовок авторизации самостоятельно.

Просто введите имя "Авторизация" и значение "Базовый BASE64 ({USERNAME: PASSWORD})"

String username = "abc";
String password = "123";
String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
httpWebRequest.Headers.Add("Authorization", "Basic " + encoded);

Изменить

Включить кодировку из UTF-8 в ISO 8859-1 за Какую кодировку следует использовать для базовой проверки подлинности HTTP? и комментарий Jeroen.

Ответ 2

Я наконец получил его!

string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2";
WebRequest request = WebRequest.Create(url);
request.Credentials = GetCredential();
request.PreAuthenticate = true;

и это GetCredential()

private CredentialCache GetCredential()
{
    string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2";
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
    CredentialCache credentialCache = new CredentialCache();
    credentialCache.Add(new System.Uri(url), "Basic", new NetworkCredential(ConfigurationManager.AppSettings["ead_username"], ConfigurationManager.AppSettings["ead_password"]));
    return credentialCache;
}

YAY!

Ответ 3

Если вы можете использовать класс WebClient, использование базовой аутентификации становится простым:

var client = new WebClient {Credentials = new NetworkCredential("user_name", "password")};
var response = client.DownloadString("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2");

Ответ 4

Попробуйте следующее:

System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); 
credentialCache.Add(
    new System.Uri("http://www.yoururl.com/"),
    "Basic", 
    new System.Net.NetworkCredential("username", "password")
);

...
...

httpWebRequest.Credentials = credentialCache; 

Ответ 5

Спектр можно читать как "ISO-8859-1" или "undefined". Твой выбор. Известно, что многие серверы используют ISO-8859-1 (например, это или нет) и не удастся при отправке чего-то еще.

Для получения дополнительной информации и предложения по исправлению ситуации см. http://greenbytes.de/tech/webdav/draft-reschke-basicauth-enc-latest.html

Ответ 6

Для тех, кто использует RestSharp, он может выйти из строя при использовании SimpleAuthenticator (возможно, из-за отсутствия ISO-8859-1 позади). Мне удалось сделать это, явно отправив заголовки Basic Authentication:

string username = "...";
string password = "...";

public IRestResponse GetResponse(string url, Method method = Method.GET)
{
    string encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes($"{username}:{password}"));
    var client = new RestClient(url);
    var request = new RestRequest(method );
    request.AddHeader("Authorization", $"Basic {encoded}");
    IRestResponse response = client.Execute(request);
    return response;
}

var response = GetResponse(url);
txtResult.Text = response.Content;