Security 从HttpURLConnection移动到HttpsURLConnection时保留身份验证相关数据

Security 从HttpURLConnection移动到HttpsURLConnection时保留身份验证相关数据,security,sharepoint,java-8,httpurlconnection,httpsurlconnection,Security,Sharepoint,Java 8,Httpurlconnection,Httpsurlconnection,所以 这里是JavaSE8应用程序 平台:IntelliJ和Mac操作系统 我通过使用NTLMauth架构,在Microsoft-SharePointWeb应用程序的主页上对其进行身份验证。我通过使用核心Java网络API来实现这一点。我尝试了其他库,比如来自Apache的库,但不知何故,身份验证只在核心Java方法中成功 好的,这里是身份验证代码,它可以工作: CookieHandler.setDefault(new CookieManager(null, CookiePolicy.A

所以

这里是JavaSE8应用程序

平台:IntelliJ和Mac操作系统

我通过使用
NTLM
auth架构,在
Microsoft-SharePoint
Web应用程序的主页上对其进行身份验证。我通过使用核心Java网络API来实现这一点。我尝试了其他库,比如来自Apache的库,但不知何故,身份验证只在核心Java方法中成功

好的,这里是身份验证代码,它可以工作:

    CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));

    final String authHost = "http://domainSample.com/one/two";

        Authenticator.setDefault(new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(
                     clientAuth.getUserAdmin() , clientAuth.getPassword().toCharArray());
            }
        });

        URL URLAuth = new URL(authHost);
        HttpURLConnection conn = (HttpURLConnection) URLAuth.openConnection();
        conn.setDoOutput(true);
        conn.setDoInput(true);

        conn.setRequestMethod("GET");
        conn.setRequestProperty("Accept", "*/*");
        conn.setUseCaches(false);

        conn.connect();
响应时
conn
对象上的标题:

{null=[HTTP/1.1 200 OK], SPIisLatency=[0], Server=[Microsoft-IIS/8.5], X-Content-Type-Options=[nosniff], Persistent-Auth=[true], Last-Modified=[Tue, 27 Jun 2017 16:37:41 GMT], X-FRAME-OPTIONS=[SAMEORIGIN], request-id=[74c9ff9d-4d14-0038-1c59-424a812a2885], Date=[Tue, 27 Jun 2017 16:37:40 GMT], MicrosoftSharePointTeamServices=[15.0.0.4911], X-MS-InvokeApp=[1; RequireReadOnly], SPRequestGuid=[74c9ff9d-4d14-0038-1c59-424a812a2885], Cache-Control=[private, max-age=0], SPRequestDuration=[94], X-AspNet-Version=[4.0.30319], Expires=[Mon, 12 Jun 2017 16:37:41 GMT], Content-Length=[161234], X-Powered-By=[ASP.NET], X-SharePointHealthScore=[0], Content-Type=[text/html; charset=utf-8]}
现在,上面的代码通过远程系统验证了客户端应用程序。现在我想在同一个系统上与REST类型的服务通信,以便在服务请求时获得响应

URL变为:

 final String urlService = "https://domainSample.com/api/birds/getAllBirds";
相关代码如下:

URL URLService = new URL(urlService);
            HttpsURLConnection conns = (HttpsURLConnection)URLService.openConnection();
            conns.setDoOutput(true);
            conns.setDoInput(true);

            conns.setRequestMethod("POST");
            conns.setRequestProperty("Accept", "*/*");
 conns.setChunkedStreamingMode(0);
            conns.connect();
显然,我得到的回应是:

HTTP 401 : Unauthorized
因为我使用的是一个新的连接对象,它现在基于HTTPS

系统使用自定义安全证书,这是我之前在JRE的密钥库中添加的

因此,我希望保留身份验证数据并将其传输到HttpsURLConnection对象上。因此,我在流程的一开始就执行身份验证,然后在实际服务系统上继续执行多个调用

现在,当您查看响应于成功身份验证(HTTP 200)的报头时,我发现没有什么有用的东西可以用于此类用例。例如,我甚至没有收到
Cookie

我在身份验证时尝试了
URLConnection
而不是
HttpURLConnection
对象,但是没有Cookie进入。 我将使用Cookie的相关键值对来标识我自己已经通过了身份验证,并在后续的每个请求中传递它

当涉及到响应的标题时,它们有一个称为:

  • 请求id
  • SPRequestGuid
看起来像是唯一的标识符,这对在后续请求中传递它们没有好处

所以


您对此有何看法?

很可能通过http发起的任何会话都无法传输到https。服务器可以看到新连接是https,可能只是拒绝将其与http标识的现有会话令牌关联。事实上,如果确实存在,这可能会被视为一个安全缺陷。Https会话通常要求在完成任何身份验证之前首先对连接进行加密,以便无法截获身份验证详细信息。换句话说,https上的身份验证只能在创建连接后启动,以确保安全

关于会话跟踪的问题,通常使用会话ID跟踪会话。会话id通过Cookie或http头进行跟踪,事实上,您可能必须实际将会话id添加到来自同一台机器的任何其他连接中(作为GET请求URL的一部分或作为POST头的一部分)。如果不这样做,您可能正在为每个http请求创建一个新会话。如果您确实正确地重新发送了会话id,则如果服务器看到来自不同浏览器或不同ip地址的具有相同id的请求,则该会话id可能会被服务器失效

即使您设法在代码中跨多个请求维护会话,也可能无法将该会话传输到https,出于上述原因,我怀疑没有web服务器会允许这样做