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

时间:2015-11-10 17:43:31

标签: c# .net wcf validation

我有一个以编程方式配置的WCF服务 - 没有XML配置文件。 我正在尝试使用存储库数据库表来实现自定义用户名密码验证以进行验证。我不希望在客户端 - 服务器上要求Windows用户名/密码。我正在使用NetTCPBinding。

我知道如何创建CustomValidator,以及如何将其分配给ServiceBehavior。 我的问题是,当服务实例化时,我不知道如何为验证器设置RepositoryConnection字符串(我不知道该机制是如何工作的。) 我的验证器的这个属性是我需要设置的 - 以编程方式 - 请记住我没有使用任何XML CONFIG文件。 public string RepositoryConnection {get;集;}

我知道我的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 Authentication: Custom Username and Password Validator asp.net

WCF custom username and password validation is not executed

WCF netTCPBinding

WCF TransportCredentialOnly not sending username and password

Windows Authentication / Encryption in WCF With NetTcpBinding

1 个答案:

答案 0 :(得分:3)

我已经采取了sample here

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