WCF服务与SQL Server 2008的集成与身份验证

在企业级应用开发中,Windows Communication Foundation (WCF) 与 SQL Server 的集成是一个常见需求。本文将介绍在Windows Server 2008环境下,如何配置WCF服务以实现与SQL Server 2008的集成,并确保用户身份验证的顺畅进行。

环境配置

首先,确保数据库服务器和客户端应用程序都运行在Windows Server 2008上,并且数据库服务器上安装了SQL Server 2008。客户端应用程序是一个使用net.tcp绑定访问业务层的WCF客户端。

客户端应用程序运行在.NET 3.5环境下,通过WCF与业务层通信。配置端点以支持委托(Delegation)。

业务层操作通过标准的SQL客户端连接到SQL Server。如果遇到常见的多跳认证问题,即客户端凭据无法通过中间层,可以尝试以下配置以实现业务层的模拟。

服务器端运行一组托管在Windows服务中的WCF服务。这些服务使用ORM层通过标准的ADO.NET SQL Server提供程序与SQL Server通信。服务操作配置为模拟。

XML配置示例

以下是客户端和服务端的XML配置示例。

<?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <client> <endpoint address="net.tcp://businessServer.domain.local:51005/TestService" binding="netTcpBinding" bindingConfiguration="defaultBinding" contract="Business.Common.Services.ITestService" name="Business.Common.Services.ITestService"> <identity> <servicePrincipalName value="TestService/businessServer.domain.local" /> </identity> </endpoint> </client> <bindings> <netTcpBinding> <binding name="defaultBinding"> <security mode="Transport"> <transport clientCredentialType="Windows" /> </security> </binding> </netTcpBinding> </bindings> </system.serviceModel> </configuration>

代码实现

在C#中,可以通过以下方式实现操作行为的模拟。

[OperationBehavior(Impersonation = ImpersonationOption.Required)] public bool SaveTest(ref Core hc, ref IList<TestEntity> testList) { using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate()) { hc.Errors = new List<Error>(); using (ISession session = SessionFactory.GetSession(new ValidationInterceptor(hc))) { using (ITransaction transaction = session.BeginTransaction()) { foreach (TestEntity alias in testList) { RepositoryFactory.Instance.Factory<TestEntity>(new ValidationInterceptor(hc) as IInterceptor).Save(session, transaction, hc, alias); } transaction.Commit(); } } return true; } }

Active Directory配置

在Active Directory中进行配置,以确保身份验证和委托能够顺利进行。以下是一些关键步骤:

在业务服务器上:

  • 打开命令提示符(以管理员身份运行)。
  • 运行cliconfg命令。
  • 确保TCP/IP位于启用协议列表的顶部。
  • 确保启用的共享内存协议未被选中。
  • 点击确定。
  • 转到“管理工具”。
  • 选择“本地安全策略”。展开“本地策略”。
  • 选择“用户权限分配”。
  • 从右侧窗格中,双击“模拟客户端认证后”。
  • 添加用户或组。
  • 在“输入要查找的对象名称”框中,输入业务服务运行的账户名称(这应该是在下面SETSPN命令中使用的相同账户)。
  • 点击“检查名称”。
  • 选择解析为完整账户名称的名称。
  • 点击确定。
  • 将回到“模拟客户端认证后”属性对话框。
  • 点击确定。

在SQL服务器上:

  • 打开SQL Server配置管理器。
  • 展开SQL Native Client 10.0配置节点(32位)。
  • 右键单击“客户端协议”并选择“属性”。
  • 确保TCP/IP位于启用协议列表的顶部。
  • 对SQL Native Client 10.0配置节点执行相同的操作。
  • 转到SQL Server网络配置。
  • 选择MSSQLSERVER的协议。
  • 在右侧窗格的列表中,确保启用了共享内存和TCP/IP。
  • 命名管道和VIA应该被禁用。

在业务服务运行的域控制器上,或服务账户用户所在的域控制器上:

  • 打开命令提示符(以管理员身份运行)。运行以下命令:
  • SETSPN -A TestService/<business-service-host-name>.<fully-qualified-domain-name> <business-service-user-account-name>
  • SETSPN -A MSSQLSvc/<sql-server-host-name>.<fully-qualified-domain-name>:1433 <sql-service-user-account-name>

在AD用户和计算机中:

  • 转到业务服务运行的账户的属性窗口。
  • 选择“委托”选项卡。
  • 选择“仅信任此用户以委派到指定服务”(这是受限委托)。
  • 选择“仅使用Kerberos”。
  • 点击“添加…”按钮。
  • 点击“用户或计算机…”按钮。
  • 在“输入要查找的对象名称”框中,输入SQL Server运行的账户名称(这应该是在SETSPN命令中使用的相同账户)。
  • 点击“检查名称”。
  • 选择解析为完整账户名称的名称。
  • 点击确定。
  • 然后将回到“添加服务”对话框。
  • 从“可用服务”列表中选择MSSQLSvc服务类型。
  • 点击确定。
  • 然后将回到账户属性窗口。
  • 点击应用。
  • 点击确定。

接下来,转到SQL Server服务运行的账户的属性窗口。

  • 选择“委托”选项卡。
  • 选择“信任此用户委派到任何服务(仅限Kerberos)”。
  • 点击应用。
  • 点击确定。

转到业务服务器的计算机账户的属性窗口。

  • 选择“委托”选项卡。
  • 确保选中了“信任此计算机委派到任何服务(仅限Kerberos)”。
  • 点击应用。
  • 点击确定。

转到SQL服务器的计算机账户的属性窗口。

  • 选择“委托”选项卡。
  • 确保选中了“信任此计算机委派到任何服务(仅限Kerberos)”。
  • 点击应用。
  • 点击确定。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485