如何处理已登录和匿名用户的操作

时间:2013-01-11 11:46:17

标签: asp.net-mvc asp.net-mvc-4

我有以下情况:

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

我的问题:

  • 如果登录用户超时,并尝试访问前面提到的 public -urls,那么该页面将把他作为notloggedin-user(以及匿名用户)处理,所以在她之前访问登录界面后显示的新网址,点击后会显示匿名界面,这可能会吓到她!我无法将她重定向到/ Account / Logon / RedirectUrI =无论如何,因为她访问的网址对未登录的用户也有效。

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

  • 这是一些代码重复
  • 对于登录用户和匿名用户,公共页面的URL会有所不同,我希望保持相同,所以登录用户可以随意复制粘贴网址,传播这个词,那个网址仍然能够处理匿名用户。

1 个答案:

答案 0 :(得分:2)

如果要保留一个Url,则必须对匿名和经过身份验证的用户使用相同的控制器/操作。

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

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

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

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