在每次调用时重新验证 WCF UserNamePasswordValidator 上的凭据
Posted
技术标签:
【中文标题】在每次调用时重新验证 WCF UserNamePasswordValidator 上的凭据【英文标题】:Revalidate Credentials on WCF UserNamePasswordValidator on each call 【发布时间】:2019-10-21 04:43:00 【问题描述】:我在 WCF over NetTcp 上使用自定义用户名/密码验证器来验证连接到我的 WCF 服务的客户端。我注意到的是,一旦客户端通过身份验证,就再也不会被验证,这意味着如果我想撤销客户端的访问权限,我需要手动强制他断开连接。
我的 serviceHost 配置如下所示:
_serviceHost.Description.Behaviors.Add(credentialsBehavior);
_serviceHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
_serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = _userValidator;
_serviceHost.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
_serviceHost.Credentials.ServiceCertificate.SetCertificate(AppSettingsManager.I.CertificateStoreLocation, AppSettingsManager.I.CertificateStoreName, AppSettingsManager.I.CertificateFindBy, AppSettingsManager.I.CertificateFindValue);
我的客户使用 ChannelFactory 进行连接:
var client = new DuplexChannelFactory<T>(new InstanceContext(this), binding, endpointAddress);
client.Credentials.UserName.UserName = ConnectionProperties.Authentication.Credentials.Username;
client.Credentials.UserName.Password = ConnectionProperties.Authentication.Credentials.Password;
client.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = AppSettingsManager.I.CertificateValidationMode;
client.CreateChannel();
有没有办法在每次通话时或定期验证客户端凭据?
【问题讨论】:
【参考方案1】:一般来说,调用后服务器会自动关闭连接,这取决于绑定的如下参数。https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/configuring-timeout-values-on-a-binding 当然我们也可以在客户端手动关闭。
client.Close()
另外,我无法理解你的意思。会话是连续的,并且您在调用服务之前已在代码 sn-ps 中设置了凭据。你是什么意思永远不会再次验证? 在我看来,如果您想撤销客户端的访问权限,您可以更改服务器端的验证逻辑。
【讨论】:
我明白了,我担心的一种情况是:客户端使用有效凭据连接到服务器。然后管理员重置他们的凭据。只要客户端不关闭连接,它们就永远不会被取消身份验证。当然,这是我可以在验证器之外手动处理的事情,但我想探索 WCF 是否可以为我做到这一点。关闭连接不是一种选择,因为我使用带有回调的客户端注册来从服务器与客户端对话。 或者我们可以通过超时参数来控制这个连接的有效性吗?像接收超时。这只是我的想法。以上是关于在每次调用时重新验证 WCF UserNamePasswordValidator 上的凭据的主要内容,如果未能解决你的问题,请参考以下文章
web 调用WCF 每次都要重新编译才能正常使用 终于解决了
每次调用端点时,自托管 WCF 服务全局对象似乎都是新创建的