0

所以,從HttpURLConnection類移動到HttpsURLConnection的

我現在看到的Java SE 8的應用程序時保持認證相關的數據。

平臺:IntelliJ和Mac OS。

我使用NTLM身份驗證模式在其主頁上使用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的培訓相關鍵值對,以確定自己是已經認證並與每個後續請求傳遞下去。

當談到頭響應,他們已經得到的東西叫做:

  • 請求ID
  • SPRequestGuid

看起來像唯一標識符,它確實沒有好他們傳遞與隨後的請求一起。

所以,

你怎麼看待它?

回答

0

很可能通過http發起的任何會話都不能轉移到https。服務器可以看到新連接是https,並且可能會拒絕將其與使用http標識的現有會話令牌相關聯。事實上,如果有的話,這可能會被視爲安全漏洞。 Https會話通常需要在任何身份驗證完成之前首先對連接進行加密,以便不會攔截身份驗證詳細信息。換言之,只有在創建連接後才能啓動通過https進行身份驗證,因爲它是安全的。

關於您關於會話跟蹤的問題,通常使用會話ID跟蹤會話。會話ID用cookie或http頭跟蹤,事實上,您可能必須將會話ID實際添加到來自同一臺計算機的任何進一步連接(作爲GET請求的URL的一部分或作爲POST頭的一部分)。如果你不這樣做,你可能會爲每一個http請求創建一個新的會話。如果您確實設法正確地重新發送會話ID,則服務器如果發現具有來自不同瀏覽器或不同IP地址的相同ID的請求,則服務器可以使其失效。

即使您設法在代碼中跨多個請求維護會話,但由於上述原因,您可能無法將該會話轉移到https,因此我懷疑沒有Web服務器允許它。

相關問題