加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 为什么WebSecurity.Logout *不立即*将IPrincipal

发布时间:2020-12-16 06:23:08 所属栏目:asp.Net 来源:网络整理
导读:首先,重要的是要注意,在我的应用程序中,如果您注销会话仍然有效,并且您不仅会被重定向回登录页面,而是保持在同一页面上. 话虽如此 – 我用这两种方式中的哪一种在MVC应用程序中注销 FormsAuthentication.SignOut()WebSecurity.Logout() 效果是相同的,如果我
首先,重要的是要注意,在我的应用程序中,如果您注销会话仍然有效,并且您不仅会被重定向回登录页面,而是保持在同一页面上.

话虽如此 – 我用这两种方式中的哪一种在MVC应用程序中注销

FormsAuthentication.SignOut()
WebSecurity.Logout()

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

User.Identity.Name
Thread.CurrentPrincipal.Identity

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

这是一个问题,因为我想生成您在登录/注销后以XXX身份登录的表单文本 – 这可能是在AJAX情况下无法进行重定向.

我很好奇是否有任何方法可以在注销(或登录)后触发IPrincipal重置自身.

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

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

解决方法

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

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

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

This related question也可能有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读