在表单身份验证cookie中存储密码 - ASP.NET和WCF调用

AJM*_*AJM 4 asp.net wcf web-services

对于我的Web应用程序安全性,我使用FormsAuthentication/MembershipProvider和非持久性cookie.

我的应用程序与某些Web服务交互,这些也使用成员资格提供程序.

用户密码在数据库中进行哈希处理.

问题是登录到应用程序的人,Web服务需要在每次加载页面时使用他的用户名和密码对Web服务进行身份验证.但是,一旦用户登录了他的密码,就不会因为它被散列而可以转换.

我想知道密码是否可以存储在身份验证cookie中,以便用户可以使用Web服务进行身份验证.

或者更好的主意!

编辑我喜欢约翰斯以下的想法但是我对机械学有4个评论,我想在下降之前解决这个问题......

Eug*_*ota 9

我同意@ John的回答,使用一次性令牌比存储凭证更好.

对于令牌,您可以生成一些随机GUID并将其存储在数据库中.

作为不需要在ASP.NET应用程序和WCF服务之间进行协调的替代方法,您可以将签名文档作为标记发送.

  1. 使用签名时间,用户名和签名者名称(ASP.NET应用程序)创建XML或JSON文档.
  2. 生成上述文档的哈希值.
  3. 使用非对称加密签署哈希(使用私钥).

所有WCF必须做的是验证哈希和签名.所以这不涉及到同一个数据库.使用签名时间,您可以在固定时间内使令牌到期.

编辑:该想法基于公钥加密(也称为非对称密钥算法,公钥/私钥).如果使用私钥加密某些内容,则只能使用相应的公钥对其进行解密; 如果使用公钥加密某些内容,则只能使用相应的私钥对其进行解密.请参阅在C#中实现RSA,了解代码在C#中的外观.为什么这有用?因为我们可以用它来实现数字签名.数字签名是一种证明我的方式,只有我写了一些东西,而没有其他人.

按照上述步骤生成签名.首先需要定义一个规范形式的"让这个人进去"文档.通常,非对称密钥算法无法处理太大的输入,因此您可以生成散列,并使用ASP.NET应用程序的私钥加密散列.生成的签名只能使用您的应用程序的公钥进行解密.最后,您可以将所有三个组件(原始文档,哈希和签名)打包成某种格式(如XML或JSON)并将其作为标记发送.

举个例子,假设你使用JSON格式.首先,原来"让这个家伙在文件中":

{"UserName":"Foo","SignedTime":"2009-07-09T00:00:00","Signer":"ASP.NET APP1"}
Run Code Online (Sandbox Code Playgroud)

接下来,您生成上述字符串的SHA-1哈希值,byte[]并使用修改后的Base64编码或其他内容对其进行编码,如下所示:

b2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 
Run Code Online (Sandbox Code Playgroud)

以上是伪造的字符串,实际的东西可能看起来更长.然后,您byte[]使用散列并使用RSA对其进行加密,RSA会生成另一个byte[]使用修改过的Base64的编码:

mxlIGdlbmVyYXRpb24gb2Yga25vd2xfo34
Run Code Online (Sandbox Code Playgroud)

最后,您创建另一个JSON文档来存储上述所有内容.

{"UserName":"Foo","SignedTime":"2009-07-09T00:00:00","Signer":"ASP.NET APP1","Hash":"b2YgYW55IGNhcm5hbCBwbGVhc3VyZS4","Signature":"mxlIGdlbmVyYXRpb24gb2Yga25vd2xfo34"}
Run Code Online (Sandbox Code Playgroud)

最终的JSON文档成为您的无密码令牌.将其传递给WCF服务.WCF服务获取令牌,通过删除哈希和签名来构造原始文档:

{"UserName":"Foo","SignedTime":"2009-07-09T00:00:00","Signer":"ASP.NET APP1"}
Run Code Online (Sandbox Code Playgroud)

遵循相同的算法生成哈希并验证它是否相同.使用ASP.NET应用程序的公钥解密Signature并查看它是否成为哈希.此时,文档被验证由签名者签名.检查当前时间和签名时间,看看令牌是否仍然有效.您所需要的只是一种在两个代码库之间分配公钥的方法,可以从XML加载.


Joh*_*ers 7

最佳做法是不要求用户在每次请求时使用其用户名和密码进行身份验证.

相反,在第一次身份验证时,Web服务应返回某种身份验证令牌.这应该存储在某个地方.我建议将其存储在会话状态,而不是在表单身份验证票证中.

当来自Web服务的票证到期时,您可能会考虑使表单身份验证票证到期,这将导致用户需要再次登录到您的站点,提供您要验证的用户名和密码,然后用于验证再次访问Web服务,存储来自Web服务的票证等.