1

我有以下情况:

  • 我有一个 ASP.NET MVC 网站/webapp,其中几乎所有控制器都受保护[AuthorizeAttribute]
  • 我引入了新页面(一个新控制器 + 一些操作),可供登录用户和匿名用户使用(我称它们为“公共”网址)。对于匿名用户,我们也使用 Session 来存储关键数据(例如,通过一些 ID 识别匿名用户等)。无论当前用户是否经过身份验证(登录)LayoutView,这些“公共”操作的设置都会被设置。如果他们通过了身份验证,那么整个childView(由“公共”操作显示)被嵌入到一个主布局页面中,该页面为登录用户显示菜单等。匿名用户没有菜单,只有纯childview页面。

我的问题:

  • 如果登录用户超时,并尝试访问上述公共-url,则该页面会将他作为未登录用户(因此作为匿名用户)处理,因此在她访问新 url 之前,她会看到已登录的-in 界面,点击后会出现一个匿名界面,可能会吓到她!我无法将她重定向到 /Account/Logon/RedirectUrI=whatever,因为她访问的 url 对未登录的用户也有效。

我能想到的唯一解决方案是引入另一个控制器/动作,它们调用与当前相同的 BLL 逻辑,但具有[AuthorizedAttribute]它们。但我想避免这种情况,因为:

  • 这有点重复代码
  • 对于登录用户和匿名用户,公共页面的 url 会有所不同,我想保持它们相同,因此登录用户可以将 url 复制粘贴到他们喜欢的任何地方,以传播word,并且该 url 仍然能够处理匿名用户。
4

1 回答 1

2

当您想保留一个 URL 时,您必须对匿名用户和经过身份验证的用户使用相同的控制器/操作。

您的问题是,当会话超时时,经过身份验证的用户会转向匿名用户并生成一个新的(匿名)会话。

你可以做些什么来区分真正的匿名用户和有时经过身份验证但现在匿名的用户是向所有在你的应用程序中登录过一次的用户发送一个特殊的 cookie。

当此类经过身份验证的用户会话超时时,浏览器会将 cookie 发送到您的服务器,您可以将他重定向到登录页面。

真正的匿名用户浏览器不会发送该 cookie,因此您可以只显示该页面。

于 2013-01-11T11:51:57.563 回答