【问题标题】:WCF: How to validate credentials in a void method?WCF:如何在 void 方法中验证凭据?
【发布时间】:2017-04-06 09:09:20
【问题描述】:

我想将我的自托管 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");
    }
  }

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

任何帮助表示赞赏。

【问题讨论】:

  • 如果为真则返回 - 因此没有错误。如果为 false,则不返回并抛出 new System.IdentityModel.Tokens.SecurityTokenException( "Unknown Username or Password");,您将在此处捕获并处理异常
  • 会崩溃吗?还是会因为您附加了调试器而中断..
  • 附加调试器时会崩溃,但没有调试器会崩溃。

标签: c# wcf void


【解决方案1】:

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

之后,我有了自己的身份验证服务(在我的情况下,我正在验证 AD 用户),如果凭据不匹配,我会抛出异常。 在这些场景中,您可以完全控制您的异常,并且可以根据需要处理它们。

如果我是你,我会这样做:

  • 创建一对 app_key/app_secret 并将它们放在前端/服务 web.config 中(假设这在服务器中是安全的),因此您可以使用自定义密码验证器,这可以确保没有其他应用程序正在使用您的服务层.
  • 创建仅用于身份验证的 Web 服务,在其中验证用户,创建将传递到前端会话的令牌。在这里,您可以随心所欲。

【讨论】:

    【解决方案2】:

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

    和我想的一样简单,只是中止线程:

    public override void Validate(string userName, string password)
    {
        if (userName == "test" && password == "test")        
            return;
    
        System.Threading.Thread.CurrentThread.Abort();
    }
    

    如果线程被中止,客户端会收到错误“403:未授权” 并且服务器应用程序继续运行。

    【讨论】:

      【解决方案3】:

      在调用方法时使用 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.
      }
      

      【讨论】:

      • 这不起作用,因为如果异常在 catch 块中,void 将返回正常并验证错误的凭据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2014-05-02
      • 2019-12-20
      相关资源
      最近更新 更多