Как вернуться на предыдущий URL после входа в систему? (Ajax)

Итак, у меня есть веб-приложение MVC5 (оно поставляется с ASP.Identity Framework), и у меня есть этот кастом Authorize приписывать.

public class FrontEndAuthorize : AuthorizeAttribute
{

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        dynamic user = (ClaimsPrincipal)httpContext.User;

        if (user.Identity.IsAuthenticated) {
            return true;
        }

        return false;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext context)
    {
        if (context.HttpContext.Request.IsAjaxRequest()) {
            dynamic urlHelper = new UrlHelper(context.RequestContext);
            context.HttpContext.Response.TrySkipIisCustomErrors = true;
            context.HttpContext.Response.StatusCode = 403;

            context.Result = new JsonResult {
                Data = new {
                    Error = "NotAuthorized",
                    LogOnUrl = urlHelper.Action("LogIn", "Account")
                },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
        } else {
            base.HandleUnauthorizedRequest(context);
        }
    }
}

И у меня есть некоторые проблемы с методом AJAX. Например, если у меня есть страница статей warheat1990.com/articles/batman-arkham-knight-review с кнопкой для отправки комментария.

[HttpPost]
[FrontEndAuthorize]
public ActionResult SubmitComment(string comment)
{
    //code here
    return Content("success");
}

И у меня есть скрипт для вызова метода, когда пользователь нажимает кнопку "Добавить комментарий".

$.ajax({
    url: '/Articles/SubmitComment/'
    type: 'POST'
    //rest of code here
})

Когда пользователь сначала нажимает кнопку "Отправить комментарий" без входа в систему, пользователь будет перенаправлен на страницу входа, однако при успешном входе пользователь возвращается на домашнюю страницу или warheat1990.com вместо warheat1990.com/articles/batman-arkham-knight-review,

Это вызвано SubmitComment метод вызывается из ajax. Поэтому мой вопрос заключается в том, что я должен сделать, чтобы иметь возможность перенаправить пользователя на предыдущую страницу при вызове ajax?

3 ответа

Решение

Основная идея заключается в том, что ваш метод HandleUnauthorizedRequest должен предоставить параметр "возврат" странице / контроллеру, обрабатывающему вход в систему. Вместо того, чтобы отправлять пользователя на страницу входа:

LogOnUrl = urlHelper.Action("LogIn", "Account")

Вы бы предоставили дополнительную returnUrl параметр запроса:

// for your ajax
LogOnUrl = urlHelper.Action("LogIn", "Account", new { returnUrl = context.HttpContext.Request.RawUrl })

// for your non-ajax:
context.Result = new RedirectToRouteResult(
                new System.Web.Routing.RouteValueDictionary
                    {                     
                            { "controller", "Account" },
                            { "action", "Login" },
                            { "returnUrl", context.HttpContext.Request.RawUrl }
                    });

Пользователь попадет на страницу вроде:

warheat1990.com/login?returnUrl=warheat1990.com%2Farticles%2Fbatman-arkham-knight-review

Если вход выполнен успешно, вы бы проанализировали запрос на параметр запроса returnUrl значение (если оно существует) и перенаправить пользователя в это место.

Вы можете получить URL звонящего, как показано ниже

if (context.HttpContext.Request.IsAjaxRequest())
            {
                UrlHelper urlHelper = new UrlHelper(context.RequestContext);
                context.HttpContext.Response.TrySkipIisCustomErrors = true;
                context.HttpContext.Response.StatusCode = 403;

                /* Get return url */
                var returnUrl = context.RequestContext.HttpContext.Request.Url.PathAndQuery;
                context.Result = new JsonResult
                    {
                        Data = new
                            {
                                Error = "NotAuthorized",
                                LogOnUrl = urlHelper.Action("LogIn", "Account", new {returnUrl})
                            },
                        JsonRequestBehavior = JsonRequestBehavior.AllowGet
                    };
            }
            else
            {
                base.HandleUnauthorizedRequest(context);
            }

и в учетной записи контроллера и действия индекса перенаправить на этот URL

[HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginModel model, string returnUrl)
        {
           /* Together with some other code */
           return RedirectToLocal(returnUrl);

        }

Вы можете получить предыдущий запрос по Request.UrlReferrer или Request.ServerVariables["http_referer"].

Затем, как только вы закончите процесс входа в систему, вы можете перенаправить на этот URL

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