【问题标题】:Where should I read my username and password for my WCF Service?我应该在哪里读取我的 WCF 服务的用户名和密码?
【发布时间】:2011-08-26 13:22:50
【问题描述】:

我有一个只有一个按钮的 WPF 应用程序。单击按钮时,它所做的就是打开服务。代码如下:

 private void button1_Click(object sender, RoutedEventArgs e)
    {
        ServiceReference1.TestServiceClient c = new ServiceReference1.TestServiceClient();

        XDocument doc = XDocument.Load(@"c:\Test\Test.xml");

        c.ClientCredentials.UserName.UserName = doc.Root.Element("Credentials").Attribute("username").Value;
        c.ClientCredentials.UserName.Password = doc.Root.Element("Credentials").Attribute("password").Value;

        try
        {
            c.Open();
        }
        catch (Exception ex)
        {

        }
    }

从上面可以看出,我正在从 xml 文件中的 Credentials 节点读取用户名和密码以验证客户端。把它放在这里是否合适,因为最初,我在我的 Validate 方法中定义了它:

 public override void Validate(string userName, string password)
    {

       // XDocument doc = XDocument.Load(@"c:\Test\Test.xml");

       // userName = doc.Root.Element("Credentials").Attribute("username").Value;
      //  password = doc.Root.Element("Credentials").Attribute("password").Value;


        if (string.IsNullOrEmpty(userName))
            throw new ArgumentNullException("userName");
        if (string.IsNullOrEmpty(password))
            throw new ArgumentNullException("password");

        // check if the user is not test
        if (userName != "test" || password != "test")
            throw new FaultException("Username and Password Failed");
    }

但是上面的问题是,无论我传递给 c.ClientCredentials.UserName.UserName 和 c.ClientCredentials.UserName.Password 什么,当它到达 Validate 方法时都会被覆盖。例如,在我的按钮单击中,如果我只有:

c.ClientCredentials.UserName.UserName = "test1";
c.ClientCredentials.UserName.Password = "test1";

上面应该失败,但是当它进入我读取具有用户名和密码属性的xml文件作为测试和测试的验证方法时,它将通过。

附带说明,我注意到我的 Validate 方法被调用,但我似乎无法介入。调试器符号未加载。

【问题讨论】:

  • 为什么要自己做安全,而不是依赖 WCF 的内置安全功能?
  • 你能澄清一下吗?我正在使用覆盖 UserNamePasswordValidator 的 Validate 方法。这不是怎么做的吗?我所做的只是从 xml 文件中读取用户名和密码。
  • 否 - 方法是使用 Windows 凭据(在 LAN/企业环境中),或使用例如ASP.NET 会员系统。让 WCF 进行所有检查和所有工作 - 您只需设置它必须去的地方寻找有效用户和密码。
  • @marc_s,这是我的场景。我没有使用 ASP.NET 成员资格或自定义成员资格提供程序。我必须验证数据库中的用户名和密码,并通过读取 xml 文件来获取用户名和密码。如何设置将在 Validate 方法中传递的用户名和密码。我不必在 Validate 方法之外设置 ClientCredentials.UserName.UserName 和 ClientCredentials.UserName.Password 吗?
  • 为什么你不能放置一个自定义会员提供者?这将是到目前为止让您自己的数据库进入 WCF 安全游戏的最简单方法.....

标签: c# wcf wcf-security


【解决方案1】:

你正在用你的读取覆盖参数

 public override void Validate(string suppliedUserName, string suppliedPassword){
     // ...
     string validUserName = doc.Root.Element("Credentials").Attribute("username").Value;
     string validPassword = doc.Root.Element("Credentials").Attribute("password").Value;

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多