asp.net mvc - FormsAuthentication.SetAuthCookie vs FormsAuth



问题1:setAuthCookie是否比FormsAuthentication.Encrypt(ticketVariable)安全?

我的意思是,如果有人试图通过修改用户名来修改setAuthCookie创建的cookie,我想这会违反后续调用的身份验证吗?

问题2:对于那些使用iPhone和平板电脑访问网站的人,我想FormsAuthentication会失败吗?考虑到我不想使用无cookieless选项,有没有另一种方法可以使该网站在智能手机网络浏览器和无智能手机浏览器上都安全?

欢呼

SetAuthCookie基本上使用提供的用户名&persistence选项,对其进行序列化,FormsAuthentication.Encrypt()对其进行加密,并将其设置在Response.Cookies集合中。SetAuthCookie和GetAuthCookie都间接调用FormsAuthentication.Encrypt。

在随后的请求中,FormsAuthenticationModule会处理AuthenticateRequest事件。如果它看到cookie(可能已过期),它会尝试使用machineKey解密其值(可能已被篡改),并将其反序列化为FormsAuthenticationTicket(可能已损坏)。如果这些(坏东西)都没有发生,票证包含用户名、发布日期、过期信息等。如果票证还没有过期,则会创建一个IIdentity和IPrincipal,并将其分配给HttpContext.Current.User和Thread.CurrentThread.Principal。在.NET 4.5及更高版本中(我认为),这是基于ClaimsIdentity、ClaimsPrincipal的声明。在此之前,我认为这是一个(GenericPrincipal,FormsIdentity)。

用户端的任何篡改都将导致该请求被视为匿名请求。它将无法解密。如果web.config/machine.config中的machineKey以某种方式落入攻击者手中,或者框架代码中存在漏洞(搜索Padding Oracle以获取这方面的历史示例),那么唯一会影响此验证的事情就是这样。

除此之外,另一件需要注意的事情就是会话劫持。例如,如果有人在公共wifi上偷走了你的cookie,他们可以将其呈现给服务器,服务器就会表现得像是你。这通常涉及网络流量嗅探。出于这些原因,最佳做法是对整个网站使用SSL,并在web.config/system.web/authorization/forms中将cookie设置为仅HTTP和安全(仅通过https连接提供)。HTTP仅意味着客户端Javascript无法使用它。仅HTTP和安全实际上意味着仅HTTPS。只有当您在整个网站上使用SSL时,这才会起作用。

FormsAuthentication在移动web浏览器上运行良好。它只是要求客户端接受cookie。据我所知,所有的移动设备都允许这样做。

最新更新