【发布时间】:2019-07-27 01:54:43
【问题描述】:
我想要实现的是在每个请求中将凭据/令牌传递给 WCF 服务。顺便说一句,这个凭据不是 windows 凭据,它们是从自定义数据库中获取的,并且身份验证逻辑非常简单,tenantId+username+password。
我目前正在使用消息检查器在标头中插入此类信息并从服务器端检查器获取它们(使用OperationContext)。
但为了保持线程安全,我必须将请求包装在每个 winform 请求中,如下所示:
using (new OperationContextScope((WcfService as ServiceClient).InnerChannel))
{
MessageHeader hdXXId = MessageHeader.CreateHeader("XXId", "CustomHeader", WinformSomeVariable.XXId);
OperationContext.Current.OutgoingMessageHeaders.Add(hdXXId);
_objXX = WcfService.GetXXById(id);
}
如上所示,这非常繁重,显然不是处理这种情况的明智方法。那么有什么方法可以安全地保存这些信息,并且还可以在 WCF Inspectors 中获取它们?
非常感谢!
PS。感谢@Abraham Qian,我一直都很傻。只需将客户端检查器放在同一个 winform 项目中即可解决此问题。
【问题讨论】:
-
你看到这个问题了吗? stackoverflow.com/questions/35223163/…
-
那么如何实现自定义用户名/密码验证呢?如果可能,为什么不使用以下方式发送客户端凭据。 ChannelFactory
factory = new ChannelFactory (binding, new EndpointAddress("localhost:11011")); factory.Credentials.UserName.UserName = "jack"; factory.Credentials.UserName.Password = "123456"; 或者客户端代理类方式,client.ClientCredentials.UserName.UserName = "jack"; client.ClientCredentials.UserName.Password = "123456"; -
@MohammadRezaHasanzadeh 我没有使用 Windows 身份验证。
-
@AbrahamQian,感谢您的建议。用户认证很简单,验证用户tenantId+username+password即可。但是使用 ChannelFactory 只提供用户名和密码,我如何传递tenantId?
-
这取决于您的验证设计。我希望您可以分享有关服务器端身份验证过程的更多详细信息。此外,使用 OperationContextScope 添加临时消息头在当前请求中可用,而不是在所有客户端请求中。您是否考虑过使用 IclientMessageInspector 接口来创建持久消息头,或者使用带有自定义用户名/密码身份验证的地址头重新设计身份验证?