Работа с истечением срока действия аутентификации на основе форм MVC во время запроса ajax - PullRequest
2 голосов
/ 28 июня 2011

В моем приложении MVC3 есть несколько ситуаций, когда я отображаю заставку, динамически загружая частичное представление с помощью методов jQuery ajax и вставляя html в DOM.

Дело в том, что если аутентификация истекает, а затем пользователь инициирует ajax-вызов, вызываемое действие перенаправляет на страницу входа в систему, поэтому HTML-код для страницы входа возвращается и вводится в DOM, что, очевидно, происходит быть крайне запутанным для пользователя.

Как люди обычно справляются с этой ситуацией? Я предполагаю, что это часто встречается, так как формы auth и запросы ajax для html - это то, что я часто делаю.

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Есть несколько решений этой проблемы здесь .Я предпочитаю решение заголовка ответа в решении 3.

2 голосов
/ 29 июня 2011

Вот фильтр действий AuthorizeAjax , который я написал именно для этой ситуации, вы можете использовать его следующим образом:

[AuthorizeAjax]
public ActionResult GetNewData()
{
    //controller logic here
}

При добавлении ниже к вашему проекту все, что вам нужно, эточастичное представление под названием «AjaxAccessError» в вашей общей папке, лично я возвращаю ссылку на страницу реального входа в систему :)

Надеюсь, это поможет!

namespace System.Web.Mvc
{
    public class AuthorizeAjaxAttribute : AuthorizeAttribute
    {
        private bool _failedAuthorisation;

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (!httpContext.User.Identity.IsAuthenticated)
            {
                _failedAuthorisation = true;
                return false;
            }
            else
            {
                String[] RoleArray = Roles.Split(',');
                foreach (var r in RoleArray)
                {
                    if (httpContext.User.IsInRole(r))
                    {
                        _failedAuthorisation = false;
                        return true;
                    }
                }

                _failedAuthorisation = true;
                return false;
            }
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            if (_failedAuthorisation)
            {
                filterContext.Result = new PartialViewResult { ViewName = "AjaxAccessError" };
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...