Подтвердить что ты не робот

Авторизовать атрибут и jquery AJAX в asp.net MVC

Я использовал функцию jquery ajax для отправки формы. Пользователи должны войти в систему иначе, они должны перенаправить на страницу входа. Я использовал для нее атрибут Authorize().

[Authorize]
public ActionResult Creat()
{
....
}

Если пользователь не войдет в систему, войдите в систему с помощью функции jquery ajax и отобразится на той же странице, но я хочу перенаправить пользователя на страницу входа в систему. Есть ли какое-либо решение?

4b9b3361

Ответ 1

Рабочий пример: https://github.com/ronnieoverby/mvc-ajax-auth

Важные части:

AjaxAuthorizeAttribute:

using System.Web.Mvc;

namespace MvcApplication1
{
    public class AjaxAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext context)
        {
            if (context.HttpContext.Request.IsAjaxRequest())
            {
                var urlHelper = new UrlHelper(context.RequestContext);
                context.HttpContext.Response.StatusCode = 403;
                context.Result = new JsonResult
                {
                    Data = new
                    {
                        Error = "NotAuthorized",
                        LogOnUrl = urlHelper.Action("LogOn", "Account")
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                base.HandleUnauthorizedRequest(context);
            }
        }
    }
}

JavaScript:

    $(function () {
        $(document).ajaxError(function (e, xhr) {
            if (xhr.status == 403) {
                var response = $.parseJSON(xhr.responseText);
                window.location = response.LogOnUrl;
            }
        });
    });

Используйте атрибут в контроллере:

    [AjaxAuthorize]
    public ActionResult Secret()
    {
        return PartialView();
    }

Сделайте несколько ajax:

@Ajax.ActionLink("Get Secret", "Secret", new AjaxOptions { UpdateTargetId = "secretArea", })

<div id="secretArea"></div>

Ответ 2

Простое дополнение к #Ronnie answer

если вы хотите, чтобы URL-адрес страницы перенаправлялся.

 var pathname = window.location.pathname;
        if (xhr.status == 403) {
                var response = $.parseJSON(xhr.responseText);
                window.location = response.LogOnUrl + '?ReturnUrl=' + pathname;
            }

Ответ 3

Ajax используется для частичного обновления содержимого страницы, поэтому было бы лучше, если бы вы обработали эту переадресацию на своей стороне клиента, в вашем обратном коде javascript/jquery. Вы также можете получить представление об этом post.

Ответ 4

В качестве другого расширения для ответа Ронни Оверби.

Его решение не работает с webapi, но это нормально, потому что вы можете использовать обычный Авторизовать атрибут, а затем обрабатывать статус 401 в функции ajaxError следующим образом.

    $(document).ajaxError(function (e, xhr) {
    //ajax error event handler that looks for either a 401 (regular authorized) or 403 (AjaxAuthorized custom actionfilter). 
    if (xhr.status == 403 ||xhr.status == 401) {
       //code here
    }
});