1

我的应用程序(MVC4/C#)使用 SimpleMembershipProvider 并且通常可以正常工作。但是,我有一个问题在花费大量时间研究和测试后无法解决。

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

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

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

来自 web.config

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

基本控制器

[Authorize]
public abstract class AuthorizeBaseController : Controller
{
}

控制器

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>
4

2 回答 2

0

这是因为

[Authorize]

AuthorizeAttribute 是 MVC 中内置的 Attribute 。制作您自己的自定义 Attribute 。你可以得到预期的结果。

现在你可以从你的每个控制器和动作中删除这个授权属性然后你的问题就解决了。

于 2013-10-17T06:31:58.083 回答
0

问题是由 SimpleMembershipProvider 引起的。简而言之,有时我的授权过滤器在 InitializeSimpleMembershipAttribute() 之前被调用。

我从这篇文章中得到了我的解决方案,它指的是Scott Allen 博客上更详细的解释

于 2013-10-20T20:12:37.920 回答