我对WCF上的模拟有疑问。我想连接到客户端应用程序调用的WCF Windows服务上的数据库。应使用运行服务的帐户完成与DB的连接。但我想验证对WCF服务的调用是否来自可信源(验证客户端应用程序的用户是域的认证用户)。
您建议我使用哪种安全措施?
我尝试过Impersonation,但是当我尝试从Windows服务连接到数据库时出现此错误:
System.Data.SqlClient.SqlException:用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。
配置字符串如下:
server = myServer; Initial Catalog = myDatabase; Integrated Security = True
服务的WCF配置如下所示:
<system.serviceModel>
<services>
<service name="MyNamespace.MyService"
behaviorConfiguration="TransfertServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8095/MyNamespace.MyService"/>
</baseAddresses>
</host>
<endpoint address=""
binding="netTcpBinding"
bindingConfiguration="TransactionalBinding"
contract="myContract" />
<endpoint address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="TransactionalBinding"
transferMode="Streamed" transactionFlow="true" maxReceivedMessageSize="1000000000">
<readerQuotas maxDepth="10000" maxStringContentLength="1000000000"
maxArrayLength="1000000000" maxBytesPerRead="10000" maxNameTableCharCount="10000" />
<security mode="Transport" />
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="TransfertServiceBehavior">
<serviceMetadata httpGetEnabled="False"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceAuthorization impersonateCallerForAllOperations="true" />
</behavior>
</serviceBehaviors>
</behaviors>
客户端应用程序上的配置如下所示:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_Client" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="true" transferMode="Streamed" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="1000000000"
maxBufferSize="1000000000" maxConnections="10" maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="1000000000"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:8095/MyNamespace.MyService"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Client"
contract="myContract" behaviorConfiguration="ImpersonationBehavior">
<identity>
<userPrincipalName value="myUsername@intra.myDomain.ca" />
</identity>
</endpoint>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="ImpersonationBehavior">
<clientCredentials>
<windows allowedImpersonationLevel="Impersonation" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
答案 0 :(得分:2)
如果您的WCF模拟,那么您必须为WCF帐户服务启用Kerberos Constrained Delegation,另请参阅Delegation and Impersonation with WCF。
Configure the WCF Service Identity Trusted for Constrained Delegation的详细说明:
- 在域控制器上,启动Microsoft管理控制台 (MMC)“Active Directory用户和计算机”管理单元。
- 在MMC管理单元的左窗格中,单击“计算机”节点。
- 在右窗格中,双击您的WCF服务器计算机 显示“属性”对话框。
- 在WCF服务器的“属性”窗口的“委派”选项卡上 计算机,不信任计算机的委派选择 默认。要使用约束委派,请选择“信任此计算机” 仅授权给指定的服务。你准确指定哪个 可以在底部窗格中访问服务或服务。
- 信任此计算机,以便委派指定的服务 仅保留默认选项“仅使用Kerberos”。
- 单击“添加”按钮以显示“添加服务”对话框。
- 单击“用户或计算机”按钮。
在“选择用户或计算机”对话框中,键入您的名称 数据库服务器计算机,如果您正在运行SQL Server作为系统或 网络服务。
或者,如果您使用自定义运行SQL Server 域帐户,请输入该帐户名,然后单击“确定”。 您将看到为所选用户或所配置的所有SPN 电脑帐户。要限制对SQL Server的访问,请选择 MSSQLSvc服务,然后单击“确定”。
答案 1 :(得分:1)
从服务配置中删除此行:
<serviceAuthorization impersonateCallerForAllOperations="true" />
来自您的客户端配置:
<behaviors>
<endpointBehaviors>
<behavior name="ImpersonationBehavior">
<clientCredentials>
<windows allowedImpersonationLevel="Impersonation" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
模拟意味着所有操作都将使用模拟用户的上下文完成=服务的标识将替换为调用用户的标识。如果您的SQL服务器本地安装在运行Windows服务的计算机上,则您的数据库调用也将被模拟。
如果您关闭模拟,您将拥有您想要的,因为服务中的执行将使用服务帐户,但服务将验证每个呼叫客户端。它由netTcpBinding
配置完成,该配置使用带有Windows集成身份验证的传输安全性。