Аутентифицированные пользователи перенаправляются для входа
Мое приложение (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>
2 ответа
Проблема была вызвана SimpleMembershipProvider. Короче говоря, иногда мой фильтр авторизации вызывался до InitializeSimpleMembershipAttribute().
Я получил свое решение из этого поста, который ссылается на более подробное объяснение в блоге Скотта Аллена
Это потому что
[Authorize]
AuthorizeAttribute - это MVC во встроенном атрибуте. сделайте свой собственный атрибут настройки. Вы можете иметь результат, как вы ожидаете.
Прямо сейчас вы можете удалить этот атрибут авторизации из каждого контроллера и действия, и тогда ваша проблема будет решена.