WCF Windows服务数据库连接和模拟问题

时间:2011-08-12 16:14:51

标签: sql-server wcf windows-services wcf-security

我对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>

2 个答案:

答案 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集成身份验证的传输安全性。