現在、トランスポート セキュリティと Windows クライアント資格情報の種類を使用して WSHttpBinding エンドポイントを介して提供されている WCF Web サービスがあります。このサービスは IIS 5.1 上でホストされ、SSL はドメイン証明機関からの証明書を使用して構成されます。IIS 自体は、ドメイン コンピューター上で test@domain.com の ID を使用して実行されます。匿名アクセスは無効になっており、統合 Windows 認証が唯一の認証方法です。
このサービスには、現在の Windows ID 名と偽装レベルを返すメソッドがあります。メソッドの OperationBehaviourAttribute で Impersonation が Required に設定されています。
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public IEnumerable<string> GetInformation()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
return new List<string>()
{
identity.Name,
identity.ImpersonationLevel.ToString()
};
}
クライアントで WCF チャネルを手動で構築し、サービスの委任を許可しています。
WSHttpBinding binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.Windows;
EndpointAddress endpoint =
new EndpointAddress("https://host/DelegateService/Service.svc");
ChannelFactory<ServiceInterface.IService> cf =
new ChannelFactory<ServiceInterface.IService>(binding, endpoint);
cf.Credentials.Windows.AllowedImpersonationLevel =
TokenImpersonationLevel.Delegation;
ServiceInterface.IService service = cf.CreateChannel();
クライアントは、信頼できる発行元の証明書ストアに移動されたドメイン証明書で署名された完全に信頼できる XBAP です。
ホスト コンピューター、test@domain.com および current@domain.com には、ドメイン内で委任の許可が設定されており、機密としてマークされているユーザーはいません。偽装が機能するため、 SeImpersonatePrivilege も問題にはなりません。
クライアントがサービス メソッドを呼び出すと、メソッドは "domain\current" と "Impersonation" を返します。私が必要とするのは、「ドメイン\現在」と「委任」です。http://msdn.microsoft.com/en-us/library/ms730088.aspxの 2 番目の表によると、これは、クライアントまたはサービスが委任できないことを意味します。
ドメインの機能レベルは Windows 2000 Mixed です。これは NTLM 認証を意味するとどこかで読みましたが、それはドメイン コントローラー間のトラフィックに言及していると思います。https 上で実行されていない場合、WiresharksupportedMech: 1.2.840.48018.1.2.2 (MS KRB5 - Microsoft Kerberos 5)
が http 応答に表示されるため、Kerberos が有効になっているように見えます。
技術的には、2 つのドメイン コントローラーがどちらも W2K3 サーバーであるため、機能レベルを Windows 2003 まで上げることができますが、IT 部門は現在、バックアップ操作などにリソースを割り当てることができず、機能レベルを上げる前に実行したいことです。レベル。
Windows Server 2003 の機能レベルにアップグレードできる仮想テスト ドメインがありますが、このドメインには証明機関や IIS がインストールされたクライアント コンピューターがないため、テスト目的で機能レベルを上げて残りのインフラストラクチャをセットアップすることができます。かなりの作業です。
これは私がしばらく解決できなかった問題です。Web には「こうすればいい」というような記事があふれているようですが、私はこれらの記事をまったく読んでいません。何が間違っているのですか?