Аутентифицированные пользователи перенаправляются для входа

Мое приложение (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 во встроенном атрибуте. сделайте свой собственный атрибут настройки. Вы можете иметь результат, как вы ожидаете.

Прямо сейчас вы можете удалить этот атрибут авторизации из каждого контроллера и действия, и тогда ваша проблема будет решена.

Другие вопросы по тегам