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身份验证/加密

WCF自定义用户名和密码验证器使用存储库数据库c#

我在这里取了样品

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作为构造函数参数,或者在将其分配给主机属性之前初始化验证器。