ASP. NET Identity (MVC 5) возвращает 200 для запроса ajax в случае несанкционированного доступа - PullRequest
0 голосов
/ 16 июня 2020

Я использую ASP. NET Identity (MVC 5), и если пользователь больше не авторизован, запросы ajax вернут 200 вместо 302 (перенаправление) или 401 (неавторизованный).

app.UseCookieAuthentication(new CookieAuthenticationOptions {
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    ExpireTimeSpan = TimeSpan.FromMinutes(20),
    SlidingExpiration = true,
    Provider = new CookieAuthenticationProvider {
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>(
            validateInterval: TimeSpan.FromMinutes(15),
            regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager), getUserIdCallback: (id) => (id.GetUserId<int>())),

    }
}); 

Авторизация через FilterConfig:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
    filters.Add(new AuthorizeAttribute());
}

simple ajax -form:

@using (Ajax.BeginForm("Index2", "Home", null, new AjaxOptions {
    InsertionMode = InsertionMode.Replace,
    HttpMethod = "POST",
    UpdateTargetId = "content",
}, new { id = "Test" })) {

    @Html.AntiForgeryToken()

    <input type="submit" value="Submit Data" id="btnSubmit" />
}

Если я вхожу в приложение, оно работает должным образом. Если я удалю .As pNet .ApplicationCook ie, он вернет код состояния 200

HTTP/2 200 OK
cache-control: private
server: Microsoft-IIS/10.0
x-aspnetmvc-version: 5.2
x-aspnet-version: 4.0.30319
x-responded-json: {"status":401,"headers":{"location":"https:\/\/localhost\/TestApp\/Account\/Login?ReturnUrl=%TestApp%2FHome%2FIndex2"}}
x-powered-by: ASP.NET
date: Tue, 16 Jun 2020 14:36:49 GMT
content-length: 0
X-Firefox-Spdy: h2

Если я проверю Application_EndRequest () в Global.asax, он также имеет код состояния 200. Я просто вижу в ответе выше, что это x-ответ- json с 401. Но ajax функция ошибки error: function (xhr, ajaxOptions, thrownError) не вызывается.

Я просто знаю такое решение на случай аутентификации форм: https://www.codeproject.com/articles/1056969/asp-mvc-handle-ajax-errors-properly

Но я не могу использовать это для ASP. NET Identity, потому что ответ будет кодом 200, а не 302.

Как я могу решить эту проблему с помощью ASP. NET Identity (MVC5)? На данный момент я получу пустой ответ ...

1 Ответ

0 голосов
/ 16 июня 2020

200 означает, что вызов был выполнен без ошибок. 302, вероятно, там нет, потому что вы используете ajax звонки, а также истек срок сеанса. Один из способов предотвратить вызовы ajax в ваше промежуточное ПО после истечения срока авторизации пользователя - это проверить наличие аутентификации в заголовке или любой другой механизм, который вы используете в глобальном обработчике ajax. Эти глобальные обработчики запускаются перед любыми другими присоединенными событиями, поэтому вы можете предотвратить распространение, если пользователь не авторизован.

$(document).ajaxError(function (event, jqxhr, settings, data) {
    _ajaxHandler.handleAjaxError(event, jqxhr, settings, data);
});
$(document).ajaxSuccess(function (event, jqxhr, settings, exception) {
    _ajaxHandler.handleAjaxSuccess(event, jqxhr, settings, exception)
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...