存储跨域Web服务访问凭据的最佳实践?

时间:2011-02-23 15:28:51

标签: windows web-services passwords credentials

我正在开发一个应用程序,它将使用Web服务连接到各种远程服务器,以检索有关这些(Windows)计算机的某些状态信息。

它在单个域中运行良好,我们可以使用Windows身份验证并确保调用服务的用户具有正确的凭据。但是,如果我们跨越无法工作的域工作,我们将需要为在应用程序端具有必要权限的用户存储一组凭据。

是否存在为这些目的存储凭据的标准方法,Windows中的某种中央密码存储或方便的内置库以提供此类功能?如果不是,那么保持中央机器上的密码安全的最佳方法是什么,并确保在需要调用这些服务时远程机器凭证可用?

我希望这个应用程序主要安装在Windows Server操作系统之一 - 2003或2008上 - 如果这对可用内容产生任何影响。

2 个答案:

答案 0 :(得分:4)

我建议您查看“Windows Identity Foundation”。对你来说可能有些过分,或者先决条件可能不匹配,但无论如何它都值得一读,因为它在基于声明的微软技术架构方面非常有启发性。

开发人员的两份主要白皮书是:

答案 1 :(得分:3)

我认为这不是Silverlight或Flash应用程序的问题,那些会有一些特殊的东西......

我使用了芬兰金融服务联合会的认证系统(所有主要的芬兰银行都使用)。它是这样的:

您的客户端和服务器都有一个密钥(或2个密钥)。

您可以存储它,例如到Windows注册表中的自定义位置(使用.NET很容易,您可以控制注册表访问)。不要将密钥硬编码到代码中,否则有人可能会使用反射来获取代码。如果平台不够安全,文件夹中的自定义xml文件也可能是危险的。

然后,我们有了请求,比方说WebService REST Url并且有一些id:

http://myserver/MyItems/15

现在,我们需要使用时间戳和单向散列算法。 有很多可用的,如md5,SHA1,SHA512,...... (也内置于Microsoft .NET库中)。 我们计算id和时间戳(以及其他一些参数)的哈希值。

为简化一点,这些算法就像模数算法一样工作:假设我的id是11,密钥是3,然后模11%3 = 2,现在哈希值是2,如果你知道id (11)和hash(2),你无法获得密钥。

真正的要求是这样的:

http://myserver/MyItems/15?timestamp=20110304171900&hash=89A234BA645FD56

该服务将检查哈希值。如果一些黑客有足够的时间,他们可以猜测有效的请求。 但该服务还将检查时间戳是否正常,如过去5分钟和未来5分钟之间。 因此,您无法调整请求,因为它会修改哈希值。

当然还有一件事是使用SSL协议。否则,您的请求可以从随机代理服务器读取。

我还推荐使用Windows Identity Foundation,但这是另一种选择。