C# 表单身份验证票据是否始终加密?

C# 表单身份验证票据是否始终加密?,c#,asp.net,asp.net-mvc,forms-authentication,C#,Asp.net,Asp.net Mvc,Forms Authentication,我的想法是:FormsAuthentication.SetAuthCookie创建的cookie总是加密的 这是我在查看Microsoft网站时的理解,该网站称票证是使用machineKey in Machine.config加密的: 为了100%确保它是加密的,我运行了以下代码: 在一页上: 在下一页: 我看到cookie的值被加密了,而且解密的很好 但是,在这里查看顶部答案时: 似乎不建议在cookie中存储敏感信息。在上面的链接中,他甚至说我猜你是在用纯文本存储cookie 在这里看第二

我的想法是:FormsAuthentication.SetAuthCookie创建的cookie总是加密的

这是我在查看Microsoft网站时的理解,该网站称票证是使用machineKey in Machine.config加密的:

为了100%确保它是加密的,我运行了以下代码:

在一页上:

在下一页:

我看到cookie的值被加密了,而且解密的很好

但是,在这里查看顶部答案时: 似乎不建议在cookie中存储敏感信息。在上面的链接中,他甚至说我猜你是在用纯文本存储cookie

在这里看第二级答案也是一样的:

如果cookie是使用machineKey自动加密的,为什么会假定他们是以纯文本形式存储的? 为什么在那里存储敏感信息会出现问题

另外,我需要存储有关已登录用户的敏感信息。

它不是总是加密的吗? 如果使用vanilla forms身份验证,默认情况下会对cookie进行加密。然而,它是一个框架——您可以自定义它——事实上,如果您熟悉API,您可以设置任何您想要的cookie。但你必须想方设法让这一切发生

那另一张海报呢? 至于所谓的问题。我不同意这个答案。正确的答案是:永远不要将密码存储在cookie或其他任何地方,加密或纯文本。密码应该是散列的,而不是存储的

我可以将密码存储在cookie中吗? 表单身份验证的工作方式是,您不需要在其中存储密码。cookie是防篡改的,如果只有您的网站可以创建cookie,并且您的网站仅在用户提供了有效凭据时创建cookie,那么仅存在cookie就足以推断在早些时候提供了正确的密码。但是,cookie应该包含用户ID或某种获取用户ID的方法

为什么我不应该把我所有的用户数据放在cookie中? 在cookie中存储不多的主要原因是它会为每个请求(包括对图像、样式表和脚本的请求)消耗带宽。浏览器向上传递的每个GET和POST都会添加一个cookie作为标题。此外,cookie的解密每次都会占用CPU,即使您在早期阶段终止SSL,也不会卸载此处理。因此,如果您想在其中存储一些标志或字符串,可以,但不要存储任何大型数据结构。如果需要存储会话中持久存在的大量数据,请考虑使用。或者,如果您正在努力开发一个无状态的web应用程序,可以将会话数据存储在数据库中,并将数据库标识符存储在cookie中

如果cookie是加密的,为什么我需要小心将敏感数据放入其中? 因为时不时地会出现。如果客户机上不需要数据,也不需要加密的数据。最好是你把这些东西放在绝对需要的地方

如果您选择使用会话状态 如果机密是敏感的,则应仅在proc会话状态下使用。如果使用SQL Server会话状态。另一种方法是在会话状态下对凭据进行加密,并且仅在使用凭据时对其进行解密,这将是一项繁琐的工作,很容易被忽略。您还可以编写一个自定义会话状态提供程序,将加密覆盖到所有内容上,但随后您会看到性能下降,因为会话状态检索几乎是针对每个页面请求进行的。所以我会去的

另外,请确保继续保护会话状态

如果你想变得现代一些 如果您正在关注微服务和REST时尚,您可以这样做:

构建一个RESTful微服务,其唯一目的是安全地存储这些凭证。该服务应仅在web服务器的本地子网(而不是internet)上可用,并应使用客户端证书和IP白名单进行保护

在REST客户端和REST服务器上实现缓存控制,并将缓存过期时间设置得相当高,可能是24小时

当网站需要凭证时,请致电microservice。如果您遵守缓存头,那么您的REST客户端也应该缓存该值,这将避免重复调用该服务

但是如果你真的想用饼干 如果您需要存储的凭据是用户自己的凭据,例如,您充当他们使用的某些Google应用程序的API传递,那么我认为您可以将这些内容放入cookie中。毕竟,用户可能在自己的机器上的某个地方有它。AES-128,如果你愿意,你可以用AES-256来证明你是认真的

如果凭证不是常规的
地球公民应该拥有,例如银行主机的应用程序密码,我不会这么做。

仅仅因为它是加密的,并不意味着有人不能用足够的时间和精力解密它。解密一个临时身份验证令牌并没有那么糟糕,因为当你发现它的时候,它已经过期了。另一方面,解密用户密码…谢谢。很抱歉,我是个新手,但这不意味着通过HTTPS发送用户密码也不那么安全吗?回答得很好。这让我想到了两个后续问题:1。如果理想情况下我们不应该将任何敏感信息放在cookie中,那么为什么cookie在默认情况下会被加密呢?2.看起来如果达到一定的尺寸,储存在饼干里会更好。在这个大小之后,最好存储在其他地方,比如session。当然,这可能是一个意见问题,但您大概会说这个阈值在哪里,比如说kb?因此,如果我真的需要存储一些敏感信息,您会建议使用HTTPS加密cookie上的会话?没有密码敏感,但仍然敏感:一些外部API的访问令牌。我意识到通常不储存敏感信息很容易逃脱,但就我的具体情况而言,我没有太多选择。谢谢John Wu
FormsAuthentication.RedirectFromLoginPage(user.user_name, false);
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

FormsAuthenticationTicket authTicket = 
FormsAuthentication.Decrypt(authCookie.Value);