为什么没有WebSecurity.Logout *立即*将IPrincipal.User更新为null用户

时间:2013-02-06 13:05:07

标签: asp.net-mvc security forms-authentication

首先,请注意,在我的应用程序中,如果您注销会话仍然有效,并且您不仅会重定向回登录页面,而是保持在同一页面上。

随着说 - 我用这两种方式在MVC应用程序中注销

FormsAuthentication.SignOut()
WebSecurity.Logout()

效果相同,如果我立即访问它们,以下属性都不会更改以反映注销:

User.Identity.Name
Thread.CurrentPrincipal.Identity

现在 - 如果我进行重定向,或者只是重新加载页面,那么显然这些属性会更新为空用户。它们并不是立即意味着User.Identity.Name代表刚刚注销的用户。

这是一个问题,因为我想在登录/注销后生成You are logged in as XXX形式的文本 - 这可能是在AJAX情况下无法进行重定向。

我很好奇是否有办法在退出(或登录)后触发IPrincipal重置自己。

我假设人们在Redirect()调用后通常只是Logout(),所以这绝不是问题,但在AJAX情况下,这并不总是切实可行。

我目前的解决方案是在我自己的包装器中抽象身份,因此一旦我注销,我就可以更新它。我只是担心这会产生一些模糊的副作用,特别是如果有人直接访问IPrincipal而不是通过包装器。

1 个答案:

答案 0 :(得分:4)

这是ASP.NET事件管道的核心限制,因为它与表单身份验证有关。这也使其容易受到重播攻击,如KB article 900111中所述。在该文章中,他们引用了一个解决方案来使用成员资格提供程序来存储有关已登录用户的一些服务器端信息。

会员提供商似乎与您考虑采用的方法非常相似,我想知道您是否应该考虑使用其中一个内置成员资格提供程序,或者将您的自定义代码编写为成员资格提供程序。这应该解决一些人不了解这种方法并直接调用IPrincipal的问题。

您的“退出但保持在同一页面上”会让问题更加突出,但最终您只是发现了每个人都使用ASP.NET的相同基本重播问题(但不是每个人都能解决它)。

This related question也可能有所帮助。