ASP.NET 标识 (MVC 5) 如果未经授权,则为 ajax 请求返回 200



我正在使用 ASP.NET 身份(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>())),
}
}); 

通过过滤器配置授权:

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

简单的 ajax 形式:

@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" />
}

如果我登录到应用程序,它会按预期工作。如果我删除.AspNet.ApplicationCookie然后返回 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

如果我检查 Global.asax 中的 Application_EndRequest((,它也有 200 状态代码。我可以在上面的响应中看到,这是一个带有 401 的 x-responded-json。但是没有调用 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 标识 (MVC5( 解决此问题?目前我会得到一个空的回应...

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)
});

相关内容

  • 没有找到相关文章

最新更新