私は次のインフラストラクチャを持っています:
コンピューター#1、Microsoft SQL Server 2008は、システムアカウントで起動しました。ログイン
Master\MyLogin
(Windows認証を使用)、サーバーロール=sysadm
、データベースロール=がありますdb_owner
。コンピューター#2、IIS7.0のWCFサービス。アカウント
Master\IISLogin
(IISLogin@myDomain.ru)で実行されるアプリケーションとサイト
構成:
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="CommonWindowsBinding" maxReceivedMessageSize="40000000">
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service behaviorConfiguration="CommonBehavior" name="MyNameSpace.AdminService">
<endpoint address="Windows" binding="netTcpBinding" bindingConfiguration="CommonWindowsBinding" name="IAdminServiceWindows" contract="MyNameSpace.IAdminService">
<identity>
<dns value="WCFServer" />
<userPrincipalName value="IISLogin@myDomain.ru"/>
</identity>
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CommonBehavior">
<dataContractSerializer maxItemsInObjectGraph="10000000" />
<serviceMetadata httpGetEnabled="true" policyVersion="Policy15" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="PeerTrust" />
</clientCertificate>
<serviceCertificate findValue="WCFServer" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyClassFullName, MyDllFullName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
サービスには方法があります
[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public bool HasRole(string roleName)
{
//work with database
}
最初にEF5.0データベースを使用します。接続文字列
"Data Source=Computer1; Initial Catalog=myDB; Integrated Security=True; Multipleactiveresultsets=True; Persist Security Info=True;"
コンピューター#3、クライアント。次の設定があります
<configuration> <system.serviceModel> <bindings> <netTcpBinding> <binding name="CommonWindowsBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="40000000"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> <security mode="TransportWithMessageCredential"> <transport clientCredentialType="Windows" /> </security> </binding> </netTcpBinding> </bindings> <client> <endpoint name="Megatec.MasterTourService.Contracts.IAdminServiceWindows" address="net.tcp://Computer2:5012/IISTest/AdminService.svc/Windows" behaviorConfiguration="CustomBehavior" binding="netTcpBinding" bindingConfiguration="CommonWindowsBinding" contract="Megatec.MasterTourService.Contracts.IAdminService"> <identity> <dns value="WCFServer" /> </identity> </endpoint> </client> <behaviors> <behavior name="CustomBehavior"> <dataContractSerializer maxItemsInObjectGraph="10000000"/> <clientCredentials> <clientCertificate findValue="WCFClient" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" /> <serviceCertificate> <defaultCertificate findValue="WCFServer" storeLocation="LocalMachine" x509FindType="FindBySubjectName" /> <authentication certificateValidationMode="PeerTrust" revocationMode="NoCheck" trustedStoreLocation="LocalMachine"/> </serviceCertificate> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> </configuration>
チャネルには次の資格情報があります
channelFactory.Credentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Delegation;
channelFactory.Credentials.Windows.ClientCredential =
System.Net.CredentialCache.DefaultNetworkCredentials;
dbエラーで落ちる
ユーザー「NTAUTHORITY\Anonymous」のログインに失敗しました
したがって、WCF委任にはいくつかの問題があります。単純な認証を使おうとするとusername/password
、うまくいきました。つまり、証明書などは問題ありません。
この命令でステップ4を実行しましたが、機能しません。
たぶん私のコードや設定に何か問題がありますか?どうすれば修正できますか?
更新。
試しました(結果なし)
[OperationBehavior(Impersonation = ImpersonationOption.Allowed)] => [OperationBehavior(Impersonation = ImpersonationOption.Required)]
試しました(結果なし)
サービス側
ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel =偽装(委任ではありません!)
IISプールのIDをApplicationPoolIdentityからIISLogin@myDomain.ruに変更しようとすると、コンピューター3のクライアントがクラッシュしました。