在企业级应用开发中,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 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中进行配置,以确保身份验证和委托能够顺利进行。以下是一些关键步骤:
在业务服务器上:
在SQL服务器上:
在业务服务运行的域控制器上,或服务账户用户所在的域控制器上:
在AD用户和计算机中:
接下来,转到SQL Server服务运行的账户的属性窗口。
转到业务服务器的计算机账户的属性窗口。
转到SQL服务器的计算机账户的属性窗口。