表单身份验证保护什么,而不是使用会话变量

时间:2013-05-14 14:32:32

标签: asp.net

我正在开发一个应用程序,该应用程序使用Session变量来跟踪用户,检查母版页是否存在,否则将其退出登录。我希望将此更改为表单身份验证,因为我读到它更安全且数据已加密。

有人可以告诉我实际加密了哪些数据?我尝试在我的网站上设置表单身份验证,它工作正常,用户正在被正确跟踪,无法登录而无法访问页面。但是,当我查看请求正文,使用Fiddler时,我看到所有表单字段和那里内容。黑客是否可以使用它来更改数据并重新提交请求,就像使用从Session变量生成的cookie一样?这个应用程序没有使用SSL,所以我理解SSL会加密正文,但我认为这也是表单身份验证的功能。否则它加密什么,只是cookie中的会话ID?

以下是我使用的代码:

    <authentication mode="Forms">
  <forms loginUrl="default.aspx" name=".ASPXFORMSAUTH_Test" defaultUrl="home.aspx" protection="All"/>
</authentication>
<authorization>
  <deny users="?"/>
</authorization>

在登录页面中我尝试手动创建cookie:

                    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                    txtEmail.Text,
                    DateTime.Now,
                    DateTime.Now.AddMinutes(30),
                    false,
                    txtEmail.Text,
                    FormsAuthentication.FormsCookiePath);

                // Encrypt the ticket.
                string encTicket = FormsAuthentication.Encrypt(ticket);

                // Create the cookie.
                Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

                // Redirect back to original URL.
                Response.Redirect(FormsAuthentication.GetRedirectUrl(txtEmail.Text, false));

我也尝试过:

FormsAuthentication.RedirectFromLoginPage(txtEmail.Text, false);

预告片,得到了相同的结果,Fiddler的请求正文显示了所有提交的字段及其内容。

3 个答案:

答案 0 :(得分:2)

将您的方法切换为表单身份验证不会使其更安全。这意味着您将使用更标准化的身份验证机制,以便更轻松地审核您的软件以解决与身份验证相关的问题。

此外,FormsAuthentication通常能够在会话到期时为用户(或应用程序池回收)工作,因为它将用户数据存储在具有自己的过期策略的加密cookie中。

答案 1 :(得分:1)

表单身份验证使用FormsAuthentication对象为用户设置cookie。 cookie包含用户的标识信息。我不确定该cookie是否仅仅是HTTP,因为仅HTTP的cookie只能在服务器上使用,而不能在客户端上使用。这些cookie在服务器上解密,它会抓取您的用户ID等。

因此,如果它不是仅HTTP的cookie,那么这可能是一个问题,除了信息被加密外,因此用户必须解密并知道底层密钥。会话我认为只会安全地跟踪会话ID,而不是实际信息。用户的信息仍存储在服务器上。

最后,人们提到的第一个也是最重要的防御是SSL。您可以从我发现的价格中获得价格低至10美元的证书......

答案 2 :(得分:1)

如果没有SSL,您不应处理用户凭据或其他敏感数据。

无论您是否使用SSL,发布的数据始终可以从客户端看到,并且始终可以“伪造”。 SSL(如果使用得当)可以防止“中间人”听取通信,但重要的是要意识到如果没有严格执行它几乎完全没用,因此你也应该考虑使用{{ 3}},即使并非所有浏览器都支持它。

会话ID不是“加密的”,但会话ID(实际上)不能“猜到”。 HTTP(S)是无状态的,并且您无法确定某个客户端本身的请求是否是恶意的。任何请求都将携带来自客户端的所有cookie,加密或不加密(当然,如果cookie中的数据被加密,很难伪造它的内容)。

可以而且应该做的是尝试保护cookie免于逃避其正确的背景,受到例如XSS和CSRF攻击。 FormsAuthentication仅将HTTP用于其cookie作为默认值。要确保您网络上的所有Cookie都是HTTP,请将以下内容放在您的web.config中:

<httpCookies httpOnlyCookies="true" />

要确保所有Cookie都绑定到安全连接,请使用:

<httpCookies requireSSL="true" />

现在,您应该使用表单身份验证的主要原因是它是一个经过验证的解决方案。 Strict Transport Security上的身份验证和会话管理失败,仅仅是因为它比你想象的要难得多。

表单身份验证还增加了可配置性和正确加密存储中的用户凭据的好处(如果您告诉它这样做)。鉴于现代基于GPU的蛮力可能性,标准实现绝不是防弹,但至少它没有做错。

如果您想了解有关标准实施如何与其业务有关的更多信息,您可以使用任何免费提供的反编译器。