如何:指定通道安全凭据
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。使用 Internet Explorer 浏览至服务的 URI (https://localhost:8000/ServiceModelSamples/Service) 以确保服务正在运行。
打开 Visual Basic 6.0 并创建一个新的 Standard .exe 文件。在窗体中添加一个按钮并双击该按钮,以将以下代码添加到 Click 处理程序中:
monString = "service:mexAddress=https://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=https://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 或 SetClientCertificateFromStoreByName 代替 SetClientCertificateFromStore 设置客户端证书:
monikerProxy.ChannelCredentials.SetClientCertificateFromFile "C:\MyClientCert.pfx", "password", "DefaultKeySet"
注意: |
---|
为使此调用生效,客户端证书在运行该客户端的计算机上应该是受信任的。 |
注意: |
---|
如果标记格式不正确,或如果服务不可用,则对 GetObject 的调用将返回一个错误,指示“语法无效”。如果您收到此错误,请确保所使用的标记正确无误且服务可用。 |
指定用户名和密码
修改服务的 App.config 文件以使用 wsHttpBinding。验证用户名和密码时需要如此:
<endpoint address="" binding="wsHttpBinding" bindingNamespace="http://Microsoft.ServiceModel.Samples" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.ICalculator" />
将 clientCredentialType 设置为 UserName:
<bindings> <wsHttpBinding> <binding name="Binding1" > <security mode="Message"> <message clientCredentialType="UserName"/> </security> </binding> </wsHttpBinding> </bindings>
打开 Visual Basic 6.0 并创建一个新的 Standard .exe 文件。在窗体中添加一个按钮并双击该按钮,以将以下代码添加到 Click 处理程序中:
monString = "service:mexAddress=https://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=https://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 时,必须提供有效的用户名和密码。
指定 Windows 凭据
在服务的 App.config 文件中将 clientCredentialType 设置为 Windows:
<bindings> <wsHttpBinding> <binding name="Binding1" > <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </wsHttpBinding> </bindings>
打开 Visual Basic 6.0 并创建一个新的 Standard .exe 文件。在窗体中添加一个按钮并双击该按钮,以将以下代码添加到 Click 处理程序中:
monString = "service:mexAddress=https://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=https://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 方法:
monString = "service:mexAddress=https://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=https://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。