如何在WCF服务上设置密码?

我正在开发一个由我们的其他软件调用的WCF服务,用于将错误信息发送到我们的数据库。 问题是,因为它是一个在线服务,它不安全,所以我想知道服务是否可以请求密码(即当我们调用服务时,我们必须配置密码或类似的东西)。

我用Google搜索了一下,但对于这么简单的事情来说,这一切看起来都很复杂……你们可以帮帮我吗?

编辑:

我们的想法是通过我的软件进行身份validation,而无需用户登录。

另一种选择是实现自己的安全性。 这是一个基本的例子。

WCF服务

在您的服务中,将ServiceBehaviorInstanceContextMode更改为PerSession ,将ConcurrencyMode更改为Single

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] public class SomeService : ISomeService { // ... } 

在您的服务中添加UsernamePassword属性。

 public string UserName { [OperationContract] get; [OperationContract] set; } public string Password { [OperationContract] get; [OperationContract] set; } 

添加用于检查安全性的私有方法。

 public void CheckSecurity() { if ((this.UserName == null || this.Password == null) || this.UserName == "username" && this.Password == "password")) { throw new FaultException("Unknown username or incorrect password."); } } 

然后在每个服务中调用CheckSecurity方法 类构造函数 方法。

 public SomeServiceMethod1() { this.CheckSecurity(); // some method codes } 

客户申请

在客户端应用程序代码中,为每个实例设置服务用户名和密码,或者创建一个静态类来为您执行此操作。

您还可以尝试在用户名和密码中使用加密来增加安全性。

请注意,这只是为您添加另一个可能符合您需求的选项,但您应该始终尝试使用Microsoft的方式。

您可以使用ASP.NET成员资格提供程序来validation客户端。 MSDN上有一篇文章描述了如何实现这一目标 。

不幸的是,安全性从未如此简单。 根据您的要求,请查看UserNamePasswordClientCredential和UserNamePasswordServiceCredential 。 他们可能就足够了。

以下所有答案都很好,但这取决于谁在使用您的WCF服务。

例如,我知道一个通​​过REST由iPhone应用程序使用的WCF服务,如果不是不可能实现的话,上面的一些方案将非常困难。 它使用类似于stefan在消息头中传递的会话密钥的解决方案。

有很多方法可以处理这种情况。

Fredrik和stefan的答案可以产生一种身份validation方法和授权(通过令牌),但您必须自己编写登录页面,数据库,代码,检查,强制执行,令牌创建,令牌嵌入和令牌validation逻辑。

PaulF的建议可能不那么重要,因为您可以使用内置于WCF中的function来携带消息传输中的凭据。 可以跳过令牌创建,令牌嵌入和令牌validation逻辑部分。

如果您计划支持许多不同的设备,我建议您查看OpenID,Windows Identity Foundation,Azure身份validation服务等。 – 这些设置有点复杂,但提供了一种可靠的,基于标准且灵活的传递凭据的方法。 如果你想走那条路,Passive Federation是一个很好的关键词。

不幸的是,正如保罗所说,安全绝非易事。 您必须考虑如何进行身份validation,您需要了解服务/应用程序中的人员,如何安全地传递其他应用程序/服务的凭据,他们如何知道您真的是您,反之亦然……一旦获得联邦身份validation设置你不再需要担心这项服务和其他人的很多事情……

validation向服务生成请求的软件本质上是一个非常困难的问题,远比认证人类用户困难得多。 该问题产生于需要存储用于构造作为认证基础发送的凭证的秘密信息。

在对人类用户进行身份validation时,您可以依赖他们能够在数据存储中存储秘密(例如PIN或密码)(只有他们有权访问的数据存储中的湿灰质)。

当您尝试对在无法控制的环境中执行的某些软件进行身份validation时,没有相同的存储位置可以保证只有您的软件可以访问它。 因此,一般情况下,您的软件无法生成请求,可靠地certificate它是由您的软件生成的,而不是其他内容。

您唯一的选择是:

  • 找到一些在运行时为软件提供秘密存储的方法,例如必须与客户端应用程序一起使用的受PIN保护的智能卡。
  • 依靠默默无闻的安全性,接受这只会使攻击者的欺骗更加困难和耗时,但不会打败那些决心破坏你的身份validation方案的人。

您需要的是实现自定义密码validation。 以下是关于此的好文章: UserNamePasswordValidator和CodeProject 。

我们在项目中使用相同的东西,但使用API​​密钥而不是Username。 在这种情况下,密码可以是任何东西