Как вернуться на предыдущий 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