使用 SQL 适配器进行安全编程

使用添加适配器服务参考 Visual Studio 插件时,如何保护凭据?

使用“添加适配器服务引用插件”创建 WCF 客户端时,可能需要为SQL Server数据库提供用户名和密码。 必须在“配置适配器”对话框的“安全”选项卡中输入凭据。 SQL 适配器不提供将用户名和密码指定为连接 URI 的一部分的选项。 这可确保满足以下条件:

  • 凭据不会显示在“添加适配器服务引用插件”对话框的“配置 URI”字段中,可访问计算机屏幕的任何人都可以读取凭据。

  • 凭据不会显示在添加适配器服务引用插件生成的配置文件中。

    有关如何使用添加适配器服务引用插件生成 WCF 客户端的详细信息,包括如何输入SQL Server数据库的用户名和密码,请参阅使用 SQL 适配器在 Visual Studio 中获取SQL Server操作的元数据

在代码中设置凭据的最佳做法是什么?

WCF 提供 ClientCredentials 类,以帮助你配置客户端通信对象(如 ChannelFactory)用于通过服务对自身进行身份验证的凭据。 通过使用 ClientCredentials 类,可确保 WCF 采用该对象的通道堆栈中指定的任何身份验证机制,并将其应用于客户端与服务之间的交换。

由于 SQL 适配器在其使用的应用程序在进程内托管,因此不必使用 ClientCredentials 类在使用应用程序使用的客户端通信对象上设置凭据。 然而,这样做被认为是好的做法。

SQL 适配器需要使用 ClientCredentials 类以编程方式传递凭据。 SQL 适配器忽略 AcceptCredentialsInUri 绑定属性,以防止在 URI 中传递凭据。

以下示例演示如何使用 Credentials 属性在 ChannelFactory 上设置 SQL Server 数据库的凭据。

// Create binding and endpoint  
SqlAdapterBinding binding = new SqlAdapterBinding();  
EndpointAddress address = new EndpointAddress("mssql://mysqlserver//mydatabase?");  
  
// Create the channel factory   
ChannelFactory<IRequestChannel> factory = new ChannelFactory<IRequestChannel>(binding, endpointAddress))  
  
// Set user name and password  
factory.Credentials.UserName.UserName = "myuser";  
factory.Credentials.UserName.Password = "mypassword";  
  
// Open the channel factory  
factory.Open();  

以下示例演示如何使用 ClientCredentials 类在 WCF 客户端上设置 SQL Server 数据库的凭据。

// Initialize a new client for the SELECT operation on the Employee table   
SqlAdapterBinding binding = new SqlAdapterBinding();  
EndpointAddress address = new EndpointAddress("mssql://mysqlserver//mydatabase?");  
TableOp_dbo_EmployeeClient client = new TableOp_dbo_EmployeeClient(binding,address);  
  
// Set user name and password  
client.ClientCredentials.UserName.UserName = "myuser";  
client.ClientCredentials.UserName.Password = "mypassword";  
  
// Open the client  
client.Open();  

如何跨进程边界提供更安全的数据交换?

SQL 适配器与使用该适配器的应用程序或服务一起托管在进程内。 由于适配器与使用者一起托管在进程内,因此无需在使用者和 SQL 适配器之间交换的消息上提供安全性。 但是,如果使用的应用程序或服务通过进程边界将包含敏感数据库信息的消息发送到另一个服务或客户端,则应采取措施为环境中的此数据提供足够的保护。 Windows Communication Foundation (WCF) 提供了许多选项来帮助保护在客户端和服务之间发送的消息。 有关帮助保护 WCF 中的客户端和服务之间发送的消息的详细信息,请参阅 保护服务和客户端。 有关 WCF 提供的安全功能的更多常规信息,请参阅 Windows Communication Foundation 安全性

另请参阅

保护 SQL 应用程序
保护 SQL 适配器的最佳做法