C # Http Обход базовой аутентификации - PullRequest
2 голосов
/ 22 ноября 2011

В приложении на C # ASP.NET мне удалось обойти обычную аутентификацию (отправив имя пользователя / пароль через заголовки «Authorization» в HTTPWebRequest), и я наконец-то получил разблокированную целевую страницу, защищенную htaccess ( расположен на другом сервере, базовая авторизация) и отправил поток обратно в браузер.

Проблема появляется, как только пользователь нажимает на ссылку, снова появляется всплывающее окно авторизации. Мы не хотим, чтобы пользователь снова вводил имя пользователя / пароль.

Кажется, мне нужно что-то отправить обратно в заголовки, чтобы сообщить браузеру, какое имя пользователя / пароль он использует для авторизации.

Я пробовал:

  • Старый формат «имя пользователя: пароль @ хост» (небезопасный, больше не разрешен в IE).
  • HTTPWebRequest, который дает мне описанную выше проблему.

Вопросы:

  • Удаленный сервер, к которому осуществляется доступ, представляет собой черный ящик.

Есть ли способ достичь этого? (Это можно сделать и в JavaScript).

Это моя функция для HttpRequest:

    public void DoWebRequest(String email, String psw, String hostname, 
    int port, String req_method, String webpage)
    {

    String path = hostname + ":" + port + "/" + webpage;
    String userdata = email + ":" + psw;
    System.Text.ASCIIEncoding encoding = new ASCIIEncoding();
    byte[] data = encoding.GetBytes(path);
    byte[] authBytes = Encoding.UTF8.GetBytes(userdata.ToCharArray());
    String req_short_host_temp = hostname;
    String req_short_host = req_short_host_temp.Replace("http://", "");

    Uri uri = new Uri(path);
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri) as HttpWebRequest;
    req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";
    req.Method = req_method;
    req.PreAuthenticate = false;
    req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);
    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    req.Headers.Add("Accept-Language: en-us,en;q=0.5");
    req.Headers.Add("Accept-Encoding: gzip,deflate");
    req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    req.KeepAlive = true;
    req.Headers.Add("Keep-Alive: 1000");
    req.ReadWriteTimeout = 320000;
    req.Timeout = 320000;
    req.Host = req_short_host;
    req.AllowAutoRedirect = true;

    req.ContentType = "application/x-www-form-urlencoded";
    req.Headers.GetType().InvokeMember("ChangeInternal", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, req.Headers, new object[] { "Host", req_short_host });

    var headers = new MyHeaderCollection();
    req.Headers = headers;
    headers.Set("Host", req_short_host);

    StreamWriter sw = new StreamWriter(req.GetRequestStream());
    sw.Write("/" + "?user=" + email + "&password=" + psw);
    sw.Close();

    HttpWebResponse response = (HttpWebResponse)req.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream());
    string tmp = reader.ReadToEnd();

    foreach (Cookie cook in response.Cookies)
    {
        tmp += "\n" + cook.Name + ": " + cook.Value;
    }

    Response.Write(tmp);
    Response.End();

}

1 Ответ

0 голосов
/ 22 ноября 2011

Не знаю о javascript, но в c # нет способа сделать это, я верю. Вы можете фильтровать все взаимодействия с пользователем, чтобы браузер никогда не обращался к другому серверу напрямую. Для этого перепишите все URL-адреса в содержимом, чтобы они указывали на ваш сценарий (обратный прокси-сервер).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...