1

我有一个需要防止未经授权的用户访问的 Web 服务。我需要根据用户名和密码公开一个 Web 服务操作来授权用户。对用户验证请求的响应应包含安全令牌。该安全令牌包含客户端应用程序可以使用的一些嵌入式用户属性,但在加密时,也将用于验证后续 Web 服务操作。未加密的令牌看起来像这样:

UID=444; DTE=2012-06-01T14:01:54.9571247Z; GID=1; WID=00:1C:B3:04:85:11; SID=lit3py55t21z5v55vlm25s55;

我可以使用对称密钥算法,因为密钥可以是客户端和服务器之间的共享密钥(我控制两者)。我使用 SHA1 和 256 的密钥大小实现了以下Rijndael 示例。

这段代码经常在互联网上被引用,但微软自己声明与 Rijndael 相关

Rijndael类是Aes算法的前身。您应该使用Aes算法而不是Rijndael。有关详细信息,请参阅.NET 安全博客中的Rijndael 和 AES 之间的差异条目。

我应该有任何安全问题吗?如果是这样,您将如何更改示例代码,或者任何人都可以提供更好、更安全的示例?

最后,作为替代方案,我正在考虑使用Windows Azure 访问控制服务针对我自己的身份提供者颁发安全令牌,并使用该令牌作为单独的调用来获取用户帐户数据。由于应用程序在 Azure 中运行,这会是更好的实现方式吗?有人愿意分享他们在这样的架构中使用 ACS 的经验吗?

顺便说一句:客户端应用程序是 iOS 5。

4

1 回答 1

1

您可以使用FormsAuthentication.Encrypt方法,而不是自己构建一些东西。此方法将加密并签署您的 FormsAuthenticationTicket(此“票证”可以包含带有附加信息的用户名)。通过签署您的票,它还可以防止篡改(这是基于机器密钥)。

加密票证只是您可以发送到移动设备的字符串。然后,对于每个其他请求,您可以简单地发送令牌并在服务器端解密它。这就是身份验证部分。

现在,如果您想将加密数据发送到您的客户端,我建议您只需通过 HTTPS 传输数据(这同样适用于您的令牌)。

参考:http: //msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.encrypt.aspx

于 2012-06-13T10:13:53.843 回答