почему использование «нового NetworkCredential (имя пользователя, пароль)» не работает для базовой аутентификации на моем веб-сайте (из приложения WinForms C #)? - PullRequest
4 голосов
/ 02 декабря 2009

У меня есть веб-сайт, который использует обычную аутентификацию (имя пользователя / пароль).

Почему следующий код не работает? Когда я запускаю его, веб-приложение переносит меня к контроллеру входа в систему, в то время как я ожидаю, что оно уже должно быть аутентифицировано, поскольку я заполняю учетные данные. Другими словами, я пытаюсь подтвердить, как в .NET я подтверждаю мой winforms HttpWebRequest, чтобы он автоматизировал процесс аутентификации. Я предполагаю, что NetworkCredential - это класс .net, который должен это делать? Или в .NET есть ожидание, что есть какой-то ручной двухэтапный процесс, который вы должны реализовать самостоятельно?

Вот код:

    // Create a new webrequest to the mentioned URL.            
    var uri = new Uri("http://10.1.1.102:3000/download/sunset");
    var myWebRequest = (HttpWebRequest)WebRequest.Create(uri);            
    myWebRequest.PreAuthenticate=true;            
    var networkCredential=new NetworkCredential("test", "asdfasdf");                        
    myWebRequest.Credentials=networkCredential;
    var myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();

    Console.Out.WriteLine("STATUS = " + myWebResponse.StatusCode);

    var stream = myWebResponse.GetResponseStream();
    var reader = new StreamReader(stream);
    string text_read = reader.ReadToEnd();
    Console.WriteLine(text_read);
    DisplayHtml(text_read);
    reader.Close();
    stream.Close();
    myWebResponse.Close();

Спасибо

Ответы [ 2 ]

15 голосов
/ 02 декабря 2009

WebRequest не отправляет учетные данные, если это не оспаривается сайтом. Сначала сайт должен ответить 401 «Требуется авторизация» с заголовком WWW-Authenticate; WebRequest ответит на запрос учетными данными, а служба должна ответить с 200 Http-контентом.

Звучит так, как будто сайт не реализует обычную аутентификацию должным образом (спецификация говорит, что сначала нужно пройти проверку, чтобы пройти в область), что является очень распространенным поведением. Вы можете добавить базовую аутентификацию вручную в коллекцию WebRequest.Headers, что в любом случае и делают большинство разработчиков.

См. HttpWebRequest не передает учетные данные

2 голосов
/ 18 мая 2017

Если кто-то ищет исправление на стороне сервера, просто добавьте

HttpContext.Response.Headers.Add("WWW-Authenticate", "Basic realm=\"MyRealm\"");

после установки StatusCode = 401

...