1

IIS でホストされる多くの WCF サービスを開発しています。(Windows Server 2003 SP2 で実行されている IIS 6.0)。これらのサービスは REST 用に設定されています。環境 (DEV、CERT、PROD) の場合、通常、IIS サーバーごとに多くのサービスがあります。各サービスには、アプリケーション プールを介して割り当てられる独自のログイン アカウントがあります。

これは正常に機能しますが、仮想ディレクトリで Windows 認証を有効にすると (偽装や委任ではなく、ユーザー コンテキストの受け渡しを許可するため)、特定のケースでセキュリティ エラーが発生します。ServiceEndpoint を使用して C# コードでサービスに接続すると機能しますが、ブラウザーまたは非 Wcf コード (HttpWebRequest、java など) を介してサービスに接続すると、セキュリティ エラーが発生します。

IIS の認証を Negotiate, NTLM から NTLM のみに変更すると、機能します。実際に起こっていることは、Kerberos を無効にすることです。これらのサービスはネットワーク内の他のサーバーと通信するため、サービスがリモート サーバー (通常は SQL サーバー) に接続できないという別の問題が発生し始めます。

ここで奇妙な部分があります。マシンに DNS エイリアス (CNAME レコード) を与え、URL をエイリアスと共に使用すると、機能します。例えば

http://dnsalias/service/myservice.svc/foo WORKS!
but
http://machinename/service/myservice.svc/foo  FAILS :(

これらすべてのマシンに DNS エイリアスを割り当てることはできません (これまではこれが解決策でした)。これは、VM を広範囲に使用し始め、それらを回転させたり回転させたりするためです。マシン名しかないので、マシンの起動時に DNS エイリアスのスクリプト作成を開始したくありません。

SPN の問題はわかりましたが、同じ Web サイト (通常は既定の Web サイト) で複数のサービスがホストされているため、サーバー/アカウントごとに 1 つのサービス プリンシパル名しか作成できません。サーバーごとに複数のサービスをホストしており、それぞれが独自のアカウントにマップされているため、これは解決策ではありません。

setspn -a HTTP//WCFServer.domain.com customDomainAccount

別のしわがあります。構成ファイルではエンドポイントを定義せず、コードでのみ定義します。REST バインディングを取得するコードは次のとおりです。

protected internal static Binding GetWebHttpBinding()
        {
            // Create a new binding with Authentication enabled
            var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly);

            // Set defaults
            SetTimeouts(binding);
            SetReaderQuotas(binding.ReaderQuotas);
            binding.MaxReceivedMessageSize = MaxReceivedMessageSize;
            binding.MaxBufferSize = 65536;

            // Set the Credential type to Windows to allow single sign-on
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

            // Need Streamed Response since Transport security does not allow streamed requests
            binding.TransferMode = TransferMode.StreamedResponse;

            return binding;
        }
4

3 に答える 3

1

わかりました、ずっと後に、私は答えで戻ってきました。説明されている環境では、唯一の答えはNTLM認証を使用することです。これは、Microsoftサポートへの問い合わせで確認されています。

于 2011-09-02T16:33:42.830 に答える
0

マシン名がすでに DNS エントリであることは理解していました。マシンの生の名前/ルックアップは、実際にはその IP アドレスです。URL に「machinename」を指定しても機能しない場合、それは既に DNS エントリではありませんか? 'machinename' に ping を実行した場合、ping に応答していることを示す IP は何ですか。これは、マシンの IP である必要があります。

私には、DNS ルックアップ用の DNS ルックアップを作成しているように思えます。これについて少し明確にしていただけますか?

私が作業しているWCFサービスまたはサイトのIPのドメインでDNSルックアップを取得すると、魔法が私にも起こることを確認できるので、あなたがどこから来ているのか理解できます.

あなたのクライアント コードがどのようなものかはわかりませんが、次のリンクを参照して照合してください。RESTful サービスを呼び出す前に、ネットワーク資格情報を作成する必要があります。これを行うと、ケルベロスを無効にする必要があるという他の問題は解決しますか?

于 2010-08-06T17:11:07.393 に答える
0

また、統合 Windows 認証と WebHttpBinding で WebHttpSecurityMode.TransportCredentialOnly を利用しようとして同様の「セキュリティ エラー」が発生してましたが、SSL が必要だったため、HttpClientCredentialType.Windowsを構成しながらWebHttpSecurityMode.Transportに固執することができました。

于 2013-02-12T04:59:55.193 に答える