2008-10-01 27 views
1

NTLM資格情報を使用して呼び出されるASPXページ(サーバー上)があります。そのページの仕事の一部は、HTMLページ(サーバーB上)を呼び出して、それをクライアントにプロキシすることです。 (ファイアウォールはAへのアクセスを許可しますが、Bへのアクセスは許可しません。通常、ユーザーは両方のサーバーへのアクセスを許可されます)。サーバーBは匿名アクセスにもオープンしていないため、資格情報を提供する必要があります。APSXページの応答からNTLM資格情報を取得

(添付のコードに従って)一部の資格情報をハードコードすると機能しますが、理想的には.aspxページで受け取った資格情報をエコーし​​ます。それらを渡すことができるようにそれらのNetworkCredentialsを取得するいくつかの方法はありますか?

protected void Page_Load(object sender, EventArgs e) { 
    Response.Clear(); 
    WebClient proxyFile = new WebClient(); 
    CredentialCache cc = new CredentialCache(); 
    cc.Add(new Uri("http://serverB/"), "NTLM", 
     new NetworkCredential("userName", "password", "domain")); 
    proxyFile.Credentials = cc; 

    Stream proxyStream = proxyFile.OpenRead("http://serverB/Content/webPage.html"); 
    int i; 
    do { 
     i = proxyStream.ReadByte(); 
     if (i != -1) { 
      Response.OutputStream.WriteByte((byte)i); 
     } 
    } while (i != -1); 
    Response.End(); 
} 

答えて

1

を。 NTLMはチャレンジ/レスポンスメカニズムを使用しているため、パスワードは送信されません。チャレンジを形成し、レスポンスをチェックするには、サーバはパスワード相当のもの(ハッシュ)にアクセスできる必要がありますが、そのパスワードを保持することができても、それと同等のものは、サーバBによって受け入れられます。

偽装を設定できる場合、別の回答に記載されているように、必ずしもあなたが望むものを取得するとは限りません。既定では、偽装サーバープロセスは、そのIDを別のサーバーに送信することはできません。その2番目のホップは委任と呼ばれ、関係するサーバー(および/またはActive Directory)で明示的に構成する必要があります。

私はあなたの唯一の選択肢は、サーバーAがアクセスしてサーバーBに提示できる資格情報のデータベースを維持することだと思います。それを安全に構築することは、微妙で時間のかかるプロセスです。一方、デフォルトで委任が無効になっている理由があります。サーバーにログインすると、他のサーバーにアクセスするために自分のIDを使用できるようにしたいのですか?委任はあなたにとって最も簡単なオプションですが、サーバーAがユーザーのIDで無責任なことを行うために侵害されないようにする必要があります。

0

Page.Userは、ページが実行されているユーザーのセキュリティプリンシパルを取得します。

そこからあなたはそれを理解できるはずです。

0

シナリオでは発信者の身元を偽装できますか?サーバーAのweb.configファイルで

<authentication mode="Windows" /> 
<identity impersonate="true" /> 

しかし、もちろん、これは、サーバーAにしたくないかもしれないとして、しかし、あなたならば、状況によって異なります。あなたも、資格情報に沿って通過する必要がある元のwouldntその方法これはカスタムコードなしであなたの問題を解決することができますか?相続人

偽装設定するためのリンク:あなたは確かに、ログイン、発信者の名前ではなく、パスワードを取得することができますhttp://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingorigcaller

関連する問題