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

时间:2011-03-03 21:51:10

标签: c# wcf wcf-security

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

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

编辑:

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

7 个答案:

答案 0 :(得分:3)

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

WCF服务

在您的服务中,将ServiceBehavior的{​​{1}}更改为InstanceContextMode,将PerSession更改为ConcurrencyMode

Single

在您的服务中添加[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] public class SomeService : ISomeService { // ... } Username媒体资源。

Password

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

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

然后在每个service 类构造函数方法中调用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

客户端应用程序

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

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

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

答案 1 :(得分:1)

您可以使用ASP.NET成员资格提供程序来验证客户端。 There is an article on MSDN describing how to achieve that

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

PaulF的建议可能不那么重要,因为您可以使用内置于WCF中的功能来在邮件传输中传输凭据。可以跳过令牌创建,令牌嵌入和令牌验证逻辑部分。

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

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

答案 5 :(得分:0)

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

在对人类用户进行身份验证时,您可以依赖他们将数据存储中的秘密(例如PIN或密码)存储在他们可以访问的数据存储中(他们耳朵之间的湿灰质)。

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

您唯一的选择是:

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

答案 6 :(得分:0)

您需要的是实现自定义密码验证。 以下是关于此的好文章: UserNamePasswordValidatorCodeProject

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