【发布时间】:2012-01-25 04:11:28
【问题描述】:
拥有一个接受用户名和密码的独立身份验证 WCF Web 服务是否有任何问题?我应该使用 https 还是其他一些最佳实践?
另外,如果我想使用 WCF Web 服务重置用户的密码,我该如何防止任何形式的暴力攻击?还是有围绕这种方法的最佳实践?我只会发送一封电子邮件/用户名来重置密码。
【问题讨论】:
标签: wcf api authentication
拥有一个接受用户名和密码的独立身份验证 WCF Web 服务是否有任何问题?我应该使用 https 还是其他一些最佳实践?
另外,如果我想使用 WCF Web 服务重置用户的密码,我该如何防止任何形式的暴力攻击?还是有围绕这种方法的最佳实践?我只会发送一封电子邮件/用户名来重置密码。
【问题讨论】:
标签: wcf api authentication
是的,您应该使用 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
【讨论】:
如果您想要外部化您的服务的身份验证,这是一种明智的方法,例如支持与另一个身份提供者(例如 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/
正如我所说,这可能比您需要的更复杂,但可能是对未来非常好的投资。
【讨论】: