在每次调用时重新验证 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

每次调用端点时,自托管 WCF 服务全局对象似乎都是新创建的

WCF 客户端代理初始化

保存在 WCF 服务中创建的列表,以便在服务重新启动时查看它

解决WCF跨机器调用时发生“调用方未由服务进行身份验证”的错误