我的应用程序(MVC4 / C#)使用SimpleMembershipProvider,通常可以正常工作。但是,我有一个问题,我花了很多时间研究和测试后无法解决。
如果我离开我的应用程序一段时间(例如30分钟),则选择一个菜单项,页面呈现(侧边栏/页眉/页脚),但@RenderBody部分重定向到〜/ Account / Login操作。
如果我然后忽略登录并单击任何控制器操作链接(从菜单中),则按预期加载。剃刀布局视图似乎正确地认为我已经过身份验证,但控制器认为我没有被授权。我有一个基类用于我继承的大多数控制器,它具有[Authorize]属性。
如果我注销,只有RenderBody部分按预期呈现,用于〜/ Account / Login操作。
来自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>
答案 0 :(得分:0)
这是因为
[Authorize]
AuthorizeAttribute是构建属性中的MVC。制作您自己的自定义属性。你可以得到你期望的结果。
现在您可以从每个Controller和Action中删除此授权属性,然后您的问题就会解决。
答案 1 :(得分:0)
问题是由SimpleMembershipProvider引起的。简而言之,有时我的Authorize过滤器在InitializeSimpleMembershipAttribute()之前被调用。
我从this post获得了我的解决方案,该解决方案涉及Scott Allen's blog
的更详细解释