Vb.net 与以编程方式使用基本身份验证的JSF应用程序交互

Vb.net 与以编程方式使用基本身份验证的JSF应用程序交互,vb.net,jsf,basic-authentication,webrequest,Vb.net,Jsf,Basic Authentication,Webrequest,我与使用基本身份验证来验证用户身份的网站进行交互时遇到困难 我正在使用visual basic,并且已经尝试使用 Dim req As HttpWebRequest = HttpWebRequest.Create("http://url.to.website.com") 将标题直接添加到web请求: req.Headers.Add("Authorization: Basic " & Convert.ToBase64String(Encoding.Default.GetBytes("us

我与使用基本身份验证来验证用户身份的网站进行交互时遇到困难

我正在使用visual basic,并且已经尝试使用

Dim req As HttpWebRequest = HttpWebRequest.Create("http://url.to.website.com")
将标题直接添加到web请求:

req.Headers.Add("Authorization: Basic " & Convert.ToBase64String(Encoding.Default.GetBytes("user" & ":" & "password")))
或使用网络凭据:

 req.Credentials = New Net.NetworkCredential("user", "password")
始终接收相同的响应代码:401未经授权

使用Firefox开发工具,我可以分析和重新发送一些web请求,只有使用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
因此,我尝试以这种方式设置它:

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)

另一次尝试是使用web浏览器:

WebBrowser1.Navigate("url", Nothing, Nothing, "Authorization: Basic " & Convert.ToBase64String(Encoding.Default.GetBytes(AUTH_USER & ":" & AUTH_PASSWORD)))
我的目标是进行身份验证,然后查询一些页面并收集响应,以便解析它们并在应用程序中稍后使用

如何解决身份验证问题

该网站是使用JSF编写的,我无法控制它

更新:

我的问题是身份验证,而不是jsf应用程序

使用Firefox时一切正常(我可以向网站发送请求,它会正确地对我进行身份验证),但使用HttpWebRequest时,身份验证失败,即使我设置了与前面所写相同的标题


我必须弄清楚这两个请求之间的区别,我必须让它正常工作。代码已编写,但标头区分大小写。无论如何,这里使用的代码如下:

/* 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("jack@example.com", "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服务。

那么您正在执行“屏幕抓取”吗?祝你好运希望对方不要改变什么。JSF不做基本的身份验证。这取决于容器,如果页面中的某些代码对其进行了检查,则与基本身份验证的概念无关。所以你的问题完全错了。另请参见,“没有成功”是什么意思?它炸毁了月球?我总是收到相同的回复代码:401Unauthorized@Kukeltje我知道autentication不是由jsf应用程序完成的,我说过该技术提供了一些上下文。关于标签,你是对的,我的错,我已经更新了它们。你确定代码的“客户端”部分可以像这样发布到jsf页面吗?我强烈怀疑。。。。(application/xml?没有“viewstate”?)请尝试,也请参见我必须与网站交互,但在我这样做之前,我必须成功地进行身份验证,因此在考虑JSF应用程序之前,我必须弄清楚auth@Nicholas谢谢你的代码,但据我所知,它和我已经尝试过的代码是一样的。问题是,即使我将标题设置为与firefox相同(wich工作),我的应用程序也无法工作