2009-07-29 39 views
5

従来のASPサイト用のVB6バックエンドがあります。そのVBは、MSXML2.XMLHTTPを使用して同じサーバー上のWebサービスを呼び出します。これは私たちのすべてのサーバーで動作します。匿名ログインを受け入れるようにWebサービスサイトを設定すると、統合セキュリティだけを強制するとMSXMLがアクセス拒否エラーを返します。MSXMLを使用してアクセスが拒否されました

私は例here.

Set objDom = CreateObject("MSXML2.DOMDocument") 
Set objXmlHttp = CreateObject("MSXML2.XMLHTTP") 

' Load XML 
objDom.async = False 
objDom.loadXML XmlBody 

' Open the webservice 
objXmlHttp.Open "POST", AsmxUrl, False 

' Create headings 
objXmlHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8" 
objXmlHttp.setRequestHeader "SOAPAction", SoapActionUrl 

' Send XML command 
objXmlHttp.send objDom.xml 

編集からのコードを使用しています:AnthonyWJonesのアドバイスに従い 私はチェックリストを下って行き、それはまだ動作していません。 Fiddlerを使用すると、401応答の単一の要求が表示されます。 [認証]タブには、次の情報が表示されます。

No Proxy-Authenticate Header is present. 
WWW-Authenticate Header is present: Negotiate 
WWW-Authenticate Header is present: NTLM 

私は奇妙な動作に気づきました。リモートデスクトップにログインしているユーザーの資格情報を使用してWebサイトに電話すると、それが動作します。私は交渉し、挑戦し、200を得て、それはうまくいくでしょう。ユーザーがリモートデスクトップ経由でログオンしていて、それ以外の時間にログオンしていない場合、これがなぜ機能するのか、

+1

壊れたクライアントはどのOSで動作していますか? ターゲットサーバのホスト名は「プレーン」ですか(ドットは含まれていますか?)。そうでない場合、イントラネットゾーンへの割り当てはプロキシスクリプト(http://msdn.microsoft.com/en-us/library/bb250483(VS.85).aspx)を介して行われ、クライアントアプリケーションが何らかの理由でプロキシを使用していないと、ゾーン割り当てが失敗し、このような動作が発生します。 – EricLaw

+0

Windows Server 2003 R2は私が使用しているOSです。ターゲットサーバのホスト名はプレーンで、ドットは含まれていません。ブラウザを使用してWebサービスに移動すると、ローカルイントラネットゾーンとして表示されます。インターネットオプション - >接続 - > LAN設定で、3つのボックスのどれもチェックされていません。おそらく、そのユーザーのためにエクスプローラが読み込まれていないときに、別の設定を使用しようとしていますか? – Ryan

答えて

3

Windows統合セキュリティを使用しているサーバーが攻撃を受けた場合、現在のユーザーの資格情報をサーバーに提示するために、基本のWinINET HTTPスタックに依存しているようです。

WinINETは、ホストサーバーがイントラネットゾーンにあると見なす場合にのみ、デフォルトでこれを行います。その場合でも、イントラネットゾーンのセキュリティ設定がこれを禁止するように調整されている可能性があります。

VB6アプリケーションを実行するのと同じユーザーとしてログオンしたときに、クライアントマシンからブラウザでサイトを表示してみてください。サーバーはどのゾーンに属していると考えていますか?イントラネットでない場合は、ゾーンに属するサイトのリストにホストを追加する必要があります。ゾーンのセキュリティ設定を開き、ユーザー認証カテゴリまでスクロールします。ログオンは、「イントラネットゾーンでの自動ログオン」として設定する必要があります。

を編集してください。あなたのコメントから、これらのことは正しく設定されています。 -

  1. サーバーがWindows統合セキュリティのみを受け入れるように厳密に構成されていることを確認します。
  2. マシンのプロキシ設定を確認してください。プロキシサーバーの問題が許可されていませんか?
  3. ProgID "MSXML2.XMLHTTP.3.0"を使用して、MSXML dllの正しいバージョンが使用されていることを確認します(他のサードパーティ製アプリケーションのインストールによってレジストリが損傷し、MSXMLの古いバージョンが使用される可能性があります)。
  4. マシンにFiddlerをインストールし、VB6アプリケーションが呼び出しを試みるときにhttp会話を見てください。単一の401応答がありますか? WinINETはユーザーの資格情報を使用していませんか? 3つの401応答がありますか? WinINETは現在のユーザー資格情報の使用を試みましたが、サーバーによって受け入れられませんでした。

これはシステム管理領域です。たとえば、フィディラートレースでNTLMを使用せずにKerberos認証を使用していることが示されている場合は、サーバーとクライアントのクロックが互いに5分以内に設定されていることと、ドメインコントローラーが設定されていることを確認します。

サーバーがドメインコントローラーに接続できない場合、サーバーのイベントログを確認します。

シンプルな置き場所。Windows統合セキュリティだけのサーバー上でhtmを実行し、ブラウザからヒットしようとすると成功するのでしょうか?

+0

Webサービスはローカルイントラネットゾーンにあり、「イントラネットゾーンでのみ自動ログオン」として設定されています。他のアイデア? – Ryan

+0

お返事ありがとうございます。あなたのテストの結果で私の質問を更新しました。私は直接それが正常に動作するWebサービスを参照する場合、私はVB DLLから呼び出すときに問題があります。 – Ryan

0

すべてのものを見た後AnthonyWJonesは私が行うことで基本認証を使用することがわかっ提案:私はそれを交渉するが、その後401を失敗し、しようとする統合セキュリティを許可されますが、場合にのみ、基本的な場合

objXmlHttp.Open "POST", AsmxUrl, False, UserName, Password 

認証が許可され、接続されます。これは私の最初の選択ではありませんが、匿名アクセスを許可するよりも優れた回避策です。彼のチェックリストは素晴らしく、この他のオプションを見つけるために私を導いたので、誰かが統合されたセキュリティの働きを説明する方法を説明できたらAnthonyWJonesに答えを出してください。

Fiddlerはこのすべてを見つけるのに非常に役立ちました。

3

Ryanに返信するのは遅すぎるかもしれませんが、他の人に同じ問題がある可能性がありますので、私はこれを投稿します。MSXML2.XMLHTTPで同じ問題が発生している開発者がいます。私はそれを知っているので、私は戻ってこれを行うサンプルを持っているを使用して使用されていますが、今は...多分最近導入されたバグ?私たちは、WinINETスタックによるローカルイントラネットの自動検出に頼っていました。そして、スタックはWindows統合を行う意思があります。サイトはプロキシバイパスリストにあり、デフォルトのオプションでローカルイントラネットに配置されています。実際には、サイトを参照して[セキュリティ設定]タブに移動すると、ローカルイントラネットが強調表示されているように見えます。ただし、MSXML2.XMLHTTPは、Windows統合を行うことをまだ望んでいません。ただし、[セキュリティ]タブの[サイト/詳細]ボタンを使用してローカルイントラネットに直接サイトを追加する場合を除きます。

私の結論は、自動的に検出されたローカルイントラネットサイトをサイトリストに直接追加されたサイトとは異なる方法で処理するWinINETスタックに今や何らかのバグが存在することです。面白いのは、がサイトにをブラウズすると、期待どおりに機能し、Windows統合は自動的に使用されます(サイトに直接追加しなくても)。プログラムでアクセスできない、動作しません。

最後に、私たちがやったことではありません。代わりに、MSXML2.ServerXMLHTTP.6.0を使用しました。そのスタック(WinHTTP)は正しく機能するようですが、デフォルトではIEのプロキシ設定を使用しないので、ProxyCfg(XP以前)またはVista用NETSH後でWinHTTPスタックのIEプロキシ設定をインポートします。欠点はそれが各クライアントマシン上で余分な構成(これは太ったクライアントのVBアプリケーションだった)です。あなたが行くことがありますので

HTTP.SetProxy 2、「myproxy.mydomain.com」、「* .mydomain.com」

:私たちが代わりにやることを選んだことは、送信前に、ちょうど次を置くことでしたmydomainサイトに接続すると、代わりにHTTP.SetProxy 0と言って、プロキシをバイパスできると思うかもしれませんが、それは動作しません。スタックには「プロキシはありますが、私のドメインではバイパスします。そして、私が行っているサイトはそのドメインにあり、それはローカルイントラネットです」と言わなければなりません。

+0

お返事ありがとうございます。可能であれば、基本的な認証の使用をやめさせたいと思っています。 – Ryan

関連する問題