【问题标题】:Stand alone authentication wcf web service独立身份验证 wcf Web 服务
【发布时间】:2012-01-25 04:11:28
【问题描述】:

拥有一个接受用户名和密码的独立身份验证 WCF Web 服务是否有任何问题?我应该使用 https 还是其他一些最佳实践?

另外,如果我想使用 WCF Web 服务重置用户的密码,我该如何防止任何形式的暴力攻击?还是有围绕这种方法的最佳实践?我只会发送一封电子邮件/用户名来重置密码。

【问题讨论】:

    标签: wcf api authentication


    【解决方案1】:

    是的,您应该使用 https。因为基于 http 的身份验证与未经身份验证的服务一样容易受到攻击,所以任何人都可以嗅探通过网络传输的纯文本。 WCF 中有一个很好的方法可以实现身份验证,使用 UserNamePasswordValidator 类。你可以在服务器上创建一些文本文件,这样就可以通过发送电子邮件等更改用户名密码。

    public class MyCustomValidator:  System.IdentityModel.Selectors.UserNamePasswordValidator
    {
         public override void Validate(string userName, string password)
        {
            if (null == userName || null == password)
            {
                throw new ArgumentNullException();
            }
    
            else
            {
                bool isValid = UserRepository.ValidateUser(userName,password); //any db based checking
    
                if(!isValid )
                {
                     throw new SecurityTokenException("Unknown Username or Password");
                }
            }
        }
    }
    

    配置:

    <system.serviceModel>
          <bindings>
            <wsHttpBinding>
              <binding name="CustomAuthentication">
                <security mode="Message">
                  <message clientCredentialType="UserName" />
                </security>
              </binding>
            </wsHttpBinding>
          </bindings>
    
          <behaviors>
            <serviceBehaviors>
              <behavior name="CustomValidator">
                <serviceCredentials>
                  <userNameAuthentication  userNamePasswordValidationMode="Custom"
                     customUserNamePasswordValidatorType="MyAssembly.MyCustomValidator, MyAssembly"/>
                </serviceCredentials>
              </behavior>
            </serviceBehaviors>
          </behaviors>      
    
          <services>
            <service name="MyService" behaviorConfiguration="CustomValidator">
              <endpoint address="" binding="wsHttpBinding" contract="IMyService" bindingConfiguration="CustomAuthentication" />
           </service>
         </services>
    </system.serviceModel>
    

    如果你想在没有 https 的情况下使用身份验证,你可以试试这个: WCF Authentication using basicHttpBinding and custom UserNamePasswordValidator

    【讨论】:

      【解决方案2】:

      如果您想要外部化您的服务的身份验证,这是一种明智的方法,例如支持与另一个身份提供者(例如 Active Directory 联合身份验证服务,甚至是使用 Windows Azure 访问控制服务的 Facebook 或 Google)的身份联合。

      这样做的另一个好处是,将来支持替代身份验证方案(例如 X.509 证书)会相对容易。

      对于您的需求而言,这似乎过于复杂,但您绝对应该考虑使用标准协议(例如 WS-Trust)来实现您的身份验证服务。在这种情况下,您的服务将是使用术语的安全令牌服务 (STS)。使用 Windows Identity Foundation (WIF) 可以很好地支持这一点,事实上,Visual Studio 的 WIF 工具包含一个示例 STS 来帮助您进行操作。

      另外,还有一个由 Dominic Baier 创建的出色的现成开源 STS,您可以下载并在必要时进行自定义(例如,使用您自己的用户名/密码存储)。你可以在这里下载

      http://identityserver.codeplex.com/

      正如我所说,这可能比您需要的更复杂,但可能是对未来非常好的投资。

      【讨论】:

      • 这实际上看起来很有趣。
      • 我最近被自己的身份验证服务所困扰,然后经过几次迭代使其变得越来越复杂,我们最终将重构为适当的 STS——就像我们应该在第一名 ;o)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多