【发布时间】:2013-03-19 11:07:38
【问题描述】:
在我的 Web 应用程序中,我使用完全自定义的功能进行登录。因此,Web.Security 没有任何内容。
我使用 Session 和 ViewState 变量控制一切。
要从应用程序中注销,我使用Session.Abandon() 命令。
不知道是不是也应该调用FormsAuthentication.SignOut()?我看了下这个方法的官方文档,没搞懂,有什么好处呢?
【问题讨论】:
在我的 Web 应用程序中,我使用完全自定义的功能进行登录。因此,Web.Security 没有任何内容。
我使用 Session 和 ViewState 变量控制一切。
要从应用程序中注销,我使用Session.Abandon() 命令。
不知道是不是也应该调用FormsAuthentication.SignOut()?我看了下这个方法的官方文档,没搞懂,有什么好处呢?
【问题讨论】:
如果您仍在使用表单身份验证(即使您没有使用内置的 ASP.NET 成员资格提供程序),那么是的,您应该调用 SignOut,因为它将摆脱身份验证 cookie。
但是,如果您甚至根本不使用表单身份验证,那么将没有身份验证 cookie,因此调用它毫无意义。
【讨论】:
我不得不承认,官方文档在SignOut 上有很多话要说。备注部分包含很多有趣的信息。
如果 CookiesSupported 为 false,SignOut 方法会从 cookie 或 URL 中删除表单身份验证票信息。您可以将 SignOut 方法与 RedirectToLoginPage 方法结合使用,以注销一个用户并允许其他用户登录。 如果您仅在无 cookie 模式下运行,或者如果您同时支持经过身份验证的用户和匿名用户,则如果由于删除匿名标识符而需要执行特殊的业务逻辑,则应显式控制重定向到登录页面。 当调用 SignOut 方法时,通过调用 Redirect 方法并将 endResponse 参数设置为 false,重定向到应用程序的登录页面。在当前页面完成执行之前不会发生重定向,因此可以运行其他代码。如果代码不包含显式重定向到另一个页面,用户将被重定向到应用程序配置文件中配置的登录页面。
调用 SignOut 方法只会删除表单身份验证 cookie。 Web 服务器不存储有效和过期的身份验证票证以供以后比较。如果恶意用户获得有效的表单身份验证 cookie,这会使您的站点容易受到重放攻击。为了提高使用表单身份验证 cookie 时的安全性,您应该执行以下操作:
- 通过将 SlidingExpiration 属性设置为 false,对表单身份验证 cookie 使用绝对过期。这限制了可以重放被劫持的 cookie 的窗口。
- 仅通过安全套接字层 (SSL) 发出和接受身份验证 cookie,方法是将 RequireSSL 属性设置为 true 并在 SSL 下运行整个网站。将 RequireSSL 属性设置为 true 可确保 ASP.NET 永远不会通过非 SSL 连接向浏览器发送身份验证 cookie;但是,客户端可能不遵守 cookie 上的安全设置。这意味着客户端可能会通过非 SSL 连接发送表单身份验证 cookie,从而使其容易受到劫持。您可以通过在 SSL 下运行整个网站来阻止客户端以明文形式发送表单身份验证 cookie。
- 使用服务器上的持久存储来记录用户何时退出网站,然后使用 PostAuthenticateRequest 事件等应用程序事件来确定当前用户是否通过表单身份验证进行身份验证。如果用户通过表单身份验证进行身份验证,并且持久存储中的信息表明用户已注销,则立即清除身份验证 cookie 并将浏览器重定向回登录页面。成功登录后,更新存储以反映用户已登录。当您使用此方法时,您的应用程序必须跟踪用户的登录状态,并且必须强制空闲用户注销。
你可以看到here
所以,总结一下,是的,你应该打电话给SignOut
【讨论】:
你不需要使用
FormsAuthentication.SignOut();
如果您不使用表单身份验证。
这是一个很好的链接
FormsAuthentication.SignOut() does not log the user out
【讨论】:
您可以使用Membership provider 以减少开发时间以满足管理安全需求(Identity)。
您还拥有tool regsql 以便为您的用户安装数据库,您还拥有RoleManager functionality 用于管理Roles 的用户(Principal)
一些链接:
http://msdn.microsoft.com/fr-fr/library/ms229862(v=vs.80).aspx
【讨论】: