WCF:如何在void方法中验证凭据?

时间:2017-04-06 09:09:20

标签: c# wcf void

我想将我的自托管WCF服务与凭证一起使用,所以我看了一些教程如何做到这一点,我来到了解决方案,继承了" UserNamePasswordValidator"类并重写Validate方法。 我可以在App.config中设置这个类:

public class UNValidator : UserNamePasswordValidator
  {
    public UNValidator() : base()
    {
    }
    public override void Validate(string userName, string password)
    {
      if (userName == "user" && password == "secret")
         return;

      throw new System.IdentityModel.Tokens.SecurityTokenException(
                "Unknown Username or Password");
    }
  }

验证方法无效!? 我在我的服务器应用程序中使用WCF服务,当有人想要登录并输入错误时服务器将崩溃。如何在不抛出异常的情况下拒绝错误的用户登录?

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:0)

根据我自己构建Web门户的经验,我不使用自定义UserNamePasswordValidator方法来验证用户,但我创建了一个应用程序密钥/密码并对其进行了验证。

之后,我有自己的身份验证服务(在我的情况下,我正在验证AD用户),如果凭据不匹配,我抛出异常。 通过这些方案,您可以完全控制异常,并可以按照自己的意愿处理它们。

如果我是你,我会做以下事情:

  • 创建一对app_key / app_secret并将它们放在前端/服务web.config中(假设这在服务器中是安全的),这样您就可以使用自定义密码验证器,这可以确保没有其他应用程序正在使用您的服务层
  • 仅创建用于身份验证的Web服务,在其中验证用户,创建将传递给前端会话的令牌。在这里,你有充分的力量做你想做的事。

答案 1 :(得分:0)

我通过尝试和错误找到了解决方案。

我认为它更简单,只需中止线程:

public override void Validate(string userName, string password)
{
    if (userName == "test" && password == "test")        
        return;

    System.Threading.Thread.CurrentThread.Abort();
}

如果线程被中止,则客户端会收到错误" 403:Unauthorized" 并且服务器应用程序继续运行。

答案 2 :(得分:-1)

在调用方法时使用try / catch块来处理异常。

try
{
    //Logging in.
    var validator = new UNValidator();
    validator.Validate(username, password);
    //Anything written past this point means your login was successful.
}
catch
{
 //Catch the exception here, which means invalid login.
}