独立认证wcf web服务

时间:2012-01-24 16:13:01

标签: wcf api authentication

使用带有用户名和密码的独立身份验证WCF Web服务是否有任何问题?我应该使用https或其他一些最佳做法吗?

此外,如果我想重置具有WCF Web服务的用户的密码,我该如何防止任何类型的暴力攻击?或者这种方法是否也有最佳实践?我只想发送一个电子邮件/用户名来重置密码。

2 个答案:

答案 0 :(得分:2)

是的,你应该使用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

答案 1 :(得分:1)

如果您想要对服务进行身份验证,这是一种明智的方法,例如,支持与其他身份提供商(如Active Directory联合身份验证服务)甚至Facebook或Google使用Windows Azure访问控制服务进行身份联合。

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

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

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

http://identityserver.codeplex.com/

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