0

したがって、HttpURLConnectionからHttpsURLConnectionに移動するときに認証に関連するデータを保持する

ここにJava SE 8アプリケーションがあります。

プラットフォーム:IntelliJ、およびMac OS。

私は、Microsoft SharePoint WebアプリケーションをホームページのNTLM認証スキーマを使用して認証します。私は、コアJavaネットワーキングAPIを使用してそれを行います。私はApacheなどの他のライブラリを試しましたが、何とかして認証はCore 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型サービスと通信したいと思います。

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 

私は新しい上ですので

URLは次のようになり接続オブジェクトは、HTTPSに基づいています。

システムではカスタムセキュリティ証明書が使用されています。これはJREのキーストアで追加したものです。

したがって、認証データを保持し、HttpsURLConnectionオブジェクトに転送します。そのため、プロセスの始めに認証を実行し、実際のサービスシステムで複数の呼び出しを続行するようにします。

ここで、正常な認証(HTTP 200)に応答してくるヘッダーを見ると、そのような場合に再利用できるものは何もありません。たとえば、Cookieを受け取っていない場合もあります。

私は、認証時にURLConnectionの代わりHttpURLConnectionオブジェクトを試してみましたが、まだクッキーが入って来ない。 私はすでに認証済みとして自分自身を識別するためにクッキーのreleventキーと値のペアを使用し、後続の各要求にそれを渡すでしょう。

それが応答でヘッダに来るとき、彼らはと呼ばれるものを持っている:

  • 要求-ID
  • はそれらを渡すは良いしなかった一意の識別子、のように見える

をSPRequestGuidその後の要求で

したがって、

あなたはどう思いますか?

答えて

0

httpで開始されたセッションはすべてhttpsに転送できない可能性があります。サーバーは新しい接続がhttpsであることを知ることができ、単純にhttpで識別される既存のセッショントークンとの関連付けを拒否することができます。事実、これはセキュリティ上の欠陥と考えられます。 Httpsセッションでは、通常、認証の詳細が傍受されないように、認証が完了する前にまず接続が暗号化されている必要があります。言い換えれば、httpsを介した認証は、接続が作成された後にのみ、それが安全であるために開始することができます。

セッショントラッキングに関する質問に関しては、セッションは通常セッションIDで追跡されます。セッションIDはCookieまたはHTTPヘッダーのいずれかで追跡されます。実際には、同じマシンからのさらなる接続にセッションIDを実際に追加する必要があります(GET要求のURLの一部として、またはPOSTのヘッダーの一部として)。そうしないと、おそらく単一のhttp要求ごとに新しいセッションが作成されています。セッションIDを正しく再送信するように管理すると、サーバが別のブラウザまたは異なるIPアドレスから来た同じIDを持つ要求を見た場合、サーバによって無効にすることができます。

コード内の複数のリクエストにまたがってセッションを管理していても、おそらくそのセッションをhttpsに転送することはできません。

関連する問題