WCF自定义用户名和密码验证器使用存储库数据库c#
本文关键字:存储 数据库 验证 用户 自定义 密码 WCF | 更新日期: 2023-09-27 18:21:28
我有一个以编程方式配置的WCF服务-没有XML配置文件。我正在尝试使用存储库数据库表来实现自定义用户名密码验证。我不希望在客户端服务器上要求Windows用户名/密码。我正在使用NetTCPBinding。
我知道如何创建CustomValidator,以及如何将其分配给ServiceBehavior。我的问题是,当服务实例化验证器时,我不知道如何为其设置RepositoryConnection字符串(我不确定该机制是如何工作的)我的验证器的这个属性是我需要通过编程设置的。请记住,我没有使用任何XML CONFIG FILE。公共字符串RepositoryConnection{get;set;}
我知道我的NetTCPBinding需要更改,因为这是我的第一次WCF安全尝试,欢迎任何评论,我将尝试更新问题以提供所需的任何进一步信息。我在下面发布了代码的相关部分。
public static NetTcpBinding SetNetTCPBinding(string name, string ns)
{
NetTcpBinding binding = new NetTcpBinding(); //SecurityMode.None);
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
binding.Security.Transport.ProtectionLevel = ProtectionLevel.None;
}
public class ServiceUserNamePasswordValidator : UserNamePasswordValidator
{
**public string RepositoryConnection { get; set;}**
public override void Validate(string userName, string password)
{
try
{
if (string.IsNullOrEmpty(userName) || password == null)
{
//throw new ArgumentNullException();
throw new FaultException("Username cannot be null or empty; Password cannot be null and should not be empty");
}
IGenericDataRepository<MyAppDBData.Users> repositorySingle = new GenericDataRepository<MyAppDBData.Users>(RepositoryConnection);
MyAppDBData.Users USER = new MyAppDBData.Users();
USER = repositorySingle.GetSingle(d => d.Name.ToLower() == userName.ToLower() && d.Password == password);
if (USER == null)
{
// This throws an informative fault to the client.
throw new FaultException("Unknown Username or Incorrect Password");
}
}
finally{
}
}
}
这是我寻找答案的地方——除了漱口。
WCF身份验证:自定义用户名和密码验证器asp.net
WCF自定义用户名和密码验证未执行
WCF网络TCPBinding
WCF TransportCredentialOnly未发送用户名和密码
使用NetTcpBinding 的WCF中的Windows身份验证/加密
我在这里取了样品
WebServiceHost host = new ServiceHost(typeof(CloudService), httpUri);
host.Description.Behaviors.Find<ServiceCredentials>().UserNameAuthentication
.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
host.Description.Behaviors.Find<ServiceCredentials>().UserNameAuthentication
.CustomUserNamePasswordValidator = new ServiceUserNamePasswordValidator(repositoryConnectionString);
因此,您可以传递存储库名称/connstring作为构造函数参数,或者在将其分配给主机属性之前初始化验证器。