Asp.net mvc 4 正在重定向到登录的已验证用户

Asp.net mvc 4 正在重定向到登录的已验证用户,asp.net-mvc-4,authentication,authorization,simplemembership,Asp.net Mvc 4,Authentication,Authorization,Simplemembership,我的应用程序MVC4/C使用SimpleMembershipProvider,通常运行良好。然而,我有一个问题,我不能解决后,我花了很多小时的研究和测试 如果我离开应用程序一段时间(比如30分钟),然后选择一个菜单项,页面将呈现侧边栏/页眉/页脚,但@RenderBody部分将重定向到~/Account/Login操作 如果我随后忽略登录并单击菜单中的任何控制器操作链接,那么它将按预期加载。razor布局视图似乎正确地认为我已通过身份验证,但控制器认为我未获得授权。我继承的大多数控制器都有一个基

我的应用程序MVC4/C使用SimpleMembershipProvider,通常运行良好。然而,我有一个问题,我不能解决后,我花了很多小时的研究和测试

如果我离开应用程序一段时间(比如30分钟),然后选择一个菜单项,页面将呈现侧边栏/页眉/页脚,但@RenderBody部分将重定向到~/Account/Login操作

如果我随后忽略登录并单击菜单中的任何控制器操作链接,那么它将按预期加载。razor布局视图似乎正确地认为我已通过身份验证,但控制器认为我未获得授权。我继承的大多数控制器都有一个基类,该基类具有[Authorize]属性

如果我注销,对于~/Account/Login操作,只有RenderBody部分按预期呈现

从web.config

<system.web>
  <roleManager enabled="true" />
  <authentication mode="Forms">
    <forms loginUrl="~/Account/Login" timeout="2880" />
  </authentication>
控制器

public class SiteController : AuthorizeBaseController 
{
    private SiteContext db = new SiteContext();

    public ActionResult Index()
    {
        return View(db.Sites.ToList());
    }

        :
_Layout.cshtml

:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width" />
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
@Styles.Render("~/Content/menubar.css")
</head>
<body>
@if (Request.IsAuthenticated)
{
    <div id="header">
        :
    </div>
    <div id="sidebar">
        :
    </div> <!-- sidebar -->
}

<div id="body">
    @RenderBody()
</div>

@if (Request.IsAuthenticated)
{
    <footer>
        :
    </footer>
}
@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
</html>
因为

[Authorize]
AuthorizeAttribute是MVC内置属性。创建自己的自定义属性。你可以得到你期望的结果


现在,您可以从每个控制器和操作中删除此Authorize属性,然后问题将得到解决。

问题是由SimpleMembershipProvider引起的。简言之,有时在初始化SimpleMembershipAttribute之前会调用我的授权筛选器


我得到了我的解决方案,其中提到了关于

的更详细的解释,您能进一步解释一下吗?我在以前的项目中使用过此属性,但在SimpleMembership中没有使用。我无法删除它,因为我已经定义了角色,并且需要[Authorizeroles=Admin]执行某些操作。我尝试按照您的建议从控制器中删除[Authorize],但这有效地删除了安全性,并允许任何未经身份验证的用户进入。我认为我的问题与缓存和/或会话管理有关,因为用户被识别为已验证的用户,但在刷新页面之前,相关的用户信息不可用。对于访问管理,您可以创建自己的属性,如此处所述,也可以检查会话是否处于活动状态。所以你会得到完美的结果。看起来这和
[Authorize]