如何:指定通道安全凭据
借助 Windows Communication Foundation (WCF) 服务名字对象,COM 应用程序可以调用 WCF 服务。 大多数 WCF 服务都要求客户端指定用于身份验证和授权的凭据。 当从 WCF 客户端调用 WCF 服务时,你可以在托管代码或应用程序配置文件中指定这些凭据。 当从 COM 应用程序调用 WCF 服务时,你可以使用 IChannelCredentials 接口指定凭据。 本主题将介绍使用 IChannelCredentials 接口指定凭据的各种方法。
注意
IChannelCredentials 是一种基于 IDispatch 的接口,在 Visual Studio 环境中使用它将无法获取 IntelliSense 功能。
本文将使用消息安全示例中定义的 WCF 服务。
指定客户端证书
在消息安全目录中运行 Setup.bat 文件以创建和安装所需的测试证书。
打开消息安全项目。
将
[ServiceBehavior(Namespace="http://Microsoft.ServiceModel.Samples")]
添加到ICalculator
接口定义中。将
bindingNamespace="http://Microsoft.ServiceModel.Samples"
添加到服务的 App.config 中的终结点标记中。生成消息安全示例并运行 Service.exe。 浏览到服务的 URI (
http://localhost:8000/ServiceModelSamples/Service
) 以确保服务正常运行。打开 Visual Basic 6.0 并创建一个新的 Standard .exe 文件。 在窗体中添加一个按钮并双击该按钮,以将以下代码添加到 Click 处理程序中:
monString = "service:mexAddress=http://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=http://localhost:8000/ServiceModelSamples/Service" monString = monString + ", contract=ICalculator, contractNamespace=http://Microsoft.ServiceModel.Samples" monString = monString + ", binding=BasicHttpBinding_ICalculator, bindingNamespace=http://Microsoft.ServiceModel.Samples" Set monikerProxy = GetObject(monString) 'Set the Service Certificate. monikerProxy.ChannelCredentials.SetServiceCertificateAuthentication "CurrentUser", "NoCheck", "PeerOrChainTrust" monikerProxy.ChannelCredentials.SetDefaultServiceCertificateFromStore "CurrentUser", "TrustedPeople", "FindBySubjectName", "localhost" 'Set the Client Certificate. monikerProxy.ChannelCredentials.SetClientCertificateFromStoreByName "CN=client.com", "CurrentUser", "My" MsgBox monikerProxy.Add(3, 4)
运行 Visual Basic 应用程序并验证结果。
Visual Basic 应用程序将显示一个消息框,其中包含调用 Add(3, 4) 的结果。 SetClientCertificateFromFile(String, String, String) 或 SetClientCertificateFromStoreByName(String, String, String) 也可以用于代替 SetClientCertificateFromStore(String, String, String, Object) 设置客户端证书:
monikerProxy.ChannelCredentials.SetClientCertificateFromFile "C:\MyClientCert.pfx", "password", "DefaultKeySet"
注意
为使此调用生效,客户端证书在运行该客户端的计算机上应该是受信任的。
注意
如果名字对象格式不正确,或者服务不可用,则对 GetObject
的调用将返回错误,指明“语法无效”。如果收到此错误,请确保使用正确的名字对象且服务可用。
指定用户名和密码
修改服务的 App.config 文件以使用
wsHttpBinding
。 验证用户名和密码时需要如此:将
clientCredentialType
设置为 UserName:打开 Visual Basic 6.0 并创建一个新的 Standard .exe 文件。 在窗体中添加一个按钮并双击该按钮,以将以下代码添加到 Click 处理程序中:
monString = "service:mexAddress=http://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=http://localhost:8000/ServiceModelSamples/Service" monString = monString + ", contract=ICalculator, contractNamespace=http://Microsoft.ServiceModel.Samples" monString = monString + ", binding=WSHttpBinding_ICalculator, bindingNamespace=http://Microsoft.ServiceModel.Samples" Set monikerProxy = GetObject(monString) monikerProxy.ChannelCredentials.SetServiceCertificateAuthentication "CurrentUser", "NoCheck", "PeerOrChainTrust" monikerProxy.ChannelCredentials.SetUserNameCredential "username", "password" MsgBox monikerProxy.Add(3, 4)
运行 Visual Basic 应用程序并验证结果。 Visual Basic 应用程序将显示一个消息框,其中包含调用 Add(3, 4) 的结果。
备注
在本示例中,服务标记中指定的绑定已更改为 WSHttpBinding_ICalculator。 另外请注意,在调用 SetUserNameCredential(String, String) 时,必须提供有效的用户名和密码。
指定 Windows 凭据
在服务的 App.config 文件中将
clientCredentialType
设置为 Windows:打开 Visual Basic 6.0 并创建一个新的 Standard .exe 文件。 在窗体中添加一个按钮并双击该按钮,以将以下代码添加到 Click 处理程序中:
monString = "service:mexAddress=http://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=http://localhost:8000/ServiceModelSamples/Service" monString = monString + ", contract=ICalculator, contractNamespace=http://Microsoft.ServiceModel.Samples" monString = monString + ", binding=WSHttpBinding_ICalculator, bindingNamespace=http://Microsoft.ServiceModel.Samples" monString = monString + ", upnidentity=domain\userID" Set monikerProxy = GetObject(monString) monikerProxy.ChannelCredentials.SetWindowsCredential "domain", "userID", "password", 1, True MsgBox monikerProxy.Add(3, 4)
运行 Visual Basic 应用程序并验证结果。 Visual Basic 应用程序将显示一个消息框,其中包含调用 Add(3, 4) 的结果。
备注
您必须使用有效值替换“domain”、“userID”和“password”。
指定颁发令牌
颁发令牌仅用于使用联合安全的应用程序。 有关联合安全的详细信息,请参阅联合令牌与颁发的令牌和联合示例。
下面的 Visual Basic 代码示例演示如何调用 SetIssuedToken(String, String, String) 方法:
monString = "service:mexAddress=http://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=http://localhost:8000/SomeService/Service" monString = monString + ", contract=ICalculator, contractNamespace=http://SomeService.Samples" monString = monString + ", binding=WSHttpBinding_ISomeContract, bindingNamespace=http://SomeService.Samples" Set monikerProxy = GetObject(monString) monikerProxy.SetIssuedToken("http://somemachine/sts", "bindingType", "binding")
有关用于此方法的参数的更多信息,请参见 SetIssuedToken(String, String, String)。