2016-02-11 6 views
0

У меня возникают трудности с взаимодействием с сайтом, использующим базовую аутентификацию для аутентификации пользователя.Взаимодействие с приложением JSF, использующим базовую аутентификацию программно

Я работаю на Visual Basic и я уже пытался использовать

Dim req As HttpWebRequest = HttpWebRequest.Create("http://url.to.website.com") 

добавляя заголовки непосредственно к веб-запроса:

req.Headers.Add("Authorization: Basic " & Convert.ToBase64String(Encoding.Default.GetBytes("user" & ":" & "password"))) 

или с использованием сетевых учетных данных

req.Credentials = New Net.NetworkCredential("user", "password") 

, получающий всегда один и тот же код ответа: 401 Несанкционированный

Используя инструменты разработчика Firefox, я могу анализировать и повторно отправлять некоторые веб-запросы, и только с помощью Firefox я могу правильно аутентифицироваться.

отчет Firefox эти заголовки:

Host: url.to.website.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101  Firefox/43.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3 
Accept-Encoding: gzip, deflate 
Referer: http.//url.to.website.com/portal/data/pub 
DNT: 1 
Authorization: Basic ZmFrZTpwYXNzd29yZA== 
Connection: keep-alive 

Так я попытался установить его manaually таким образом:

req.Host = "url.to.website.com" 
req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0" 
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 
req.Referer = "https://url.to.website.com/some/path/to/file.jsf" 
req.ContentType = "application/x-www-form-urlencoded" 
req.KeepAlive = True 
req.PreAuthenticate = True 
req.Method = "POST" 
req.Headers.Add("Authorization: Basic " & Convert.ToBase64String(Encoding.Default.GetBytes("user" & ":" & "password"))) 

без успеха (получение всегда один и тот же код ответа: 401 Несанкционированное)

Другая попытка была с веб-браузером:

WebBrowser1.Navigate("url", Nothing, Nothing, "Authorization: Basic " & Convert.ToBase64String(Encoding.Default.GetBytes(AUTH_USER & ":" & AUTH_PASSWORD))) 

Моя цель - аутентифицировать, затем запрашивать некоторые страницы и собирать ответы, чтобы их проанализировать и использовать позже в приложении.

Как я могу решить проблему аутентификации?

Веб-сайт написан с использованием JSF, и я не контролирую его.

Update:

Моя проблема заключается в проверке подлинности, но не о JSF приложения.

При использовании Firefox все отлично работает (я могу отправить запрос на веб-сайт, и он будет аутентифицировать меня правильно), но при использовании HttpWebRequest аутентификации не удается, даже если установить одни и те же заголовки, как написано раньше.

Я должен выяснить разницу между двумя запросами

+0

Значит, вы делаете «скрипинг экрана»? Удачи ... Надеюсь, что другая сторона ничего не изменит ** ничего **. И JSF не выполняет базовую аутентификацию. Это зависит от контейнера, и если он проверен некоторым кодом на странице, это не связано с понятием базовой аутентификации. Таким образом, вы сомневаетесь, что полностью ошибаетесь. См. Также http://stackoverflow.com/questions/12175763/how-to-send-post-request-to-jsf-component-without-using-html-form – Kukeltje

+0

И что означает «без успеха»? Это взорвало луну? – Kukeltje

+0

Я получал всегда один и тот же код ответа: 401 Несанкционированный –

ответ

0

я должен был получить эту работу для Dukes Forest Java EE Tutorial Port to Wildfly. Код уже был написан, но заголовок был чувствителен к регистру. Во всяком случае, код, используемый там следующим образом:

/* Client filter for basic HTTP auth */ 
class AuthClientRequestFilter implements ClientRequestFilter { 
    private final String user; 
    private final String password; 
    public AuthClientRequestFilter(String user, String password) { 
     this.user = user; 
     this.password = password; 
    } 
    @Override 
    public void filter(ClientRequestContext requestContext) throws IOException { 
     try { 
      requestContext.getHeaders().add(
       "Authorization", 
       "Basic " + DatatypeConverter.printBase64Binary(
        (user+":"+password).getBytes("UTF-8")) 
      ); 
     } catch (UnsupportedEncodingException ex) { } 
    } 
} 

DatatypeConverter импортируется из javax.xml.bind. Этот код вызывается из следующей процедуры, которая имеет HTTPClient:

Client client = ClientBuilder.newClient(); 
client.register(new AuthClientRequestFilter("[email protected]", "1234")); 
Response resp = client.target(ENDPOINT) 
    .request(MediaType.APPLICATION_XML) 
    .post(Entity.entity(order, MediaType.APPLICATION_XML), Response.class); 
int status = resp.getStatus(); 
if (status == 200) { 
    success = true; 
} 
logger.log(Level.INFO, "[PaymentHandler] Response status {0}", status); 
client.close(); 
return success; 

Этот код клиента отправляется службе RESTful.

+0

Вы уверены, что часть «клиента» может сделать сообщение на странице jsf, как это? Я очень сомневаюсь в этом .... (application/xml? No 'viewstate'?) Пожалуйста ** попробуйте **, см. Также http://stackoverflow.com/questions/12175763/how-to-send-post-request- to-jsf-component-without-use-html-form – Kukeltje

+0

Мне нужно будет взаимодействовать с веб-сайтом, но прежде чем я смогу это сделать, мне нужно успешно пройти аутентификацию, поэтому, прежде чем думать о приложении JSF, мне нужно выяснить auth –

+0

. помощь по коду? –

 Смежные вопросы

  • Нет связанных вопросов^_^