繁体   English   中英

ASP.NET 核心 MVC - 为什么 Ajax JSON 请求在 POST 上返回 400 而不是 403

[英]ASP.NET Core MVC - Why does Ajax JSON request return 400 on POST instead of 403

我有一个 ASP.NET 核心 MVC 应用程序。 如果我正在使用dataType: "json"执行 AJAX POST,并且我返回 Forbid Forbid()那么我总是会收到400 Bad Request而不是返回403 Forbidden 但是在 GET 请求的情况下,将返回403 Forbidden

以下示例 - 我正在使用 .NET Core 6 和这个启动脚本:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseExceptionHandler("/Error/");
    app.UseStatusCodePagesWithReExecute("/Error/{0}");
    app.UseHsts();
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthentication();
    app.UseMiddleware<SerilogMiddleware>();
    app.UseSerilogRequestLogging();
    app.UseAuthorization();

    app.UseEndpoints(endpoints => {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}")
        .RequireAuthorization();
    });
}

Controller:

public class HomeController : Controller
{
    public ActionResult Get()
    {
        return Forbid();
    }

    [HttpPost]
    [IgnoreAntiforgeryToken] //just for demo to keep it simple
    public ActionResult Post()
    {
        return Forbid();

    }
}

Ajax 请求:

$.ajax({
    type: "GET",
    url: "Home/Get",
    dataType: "json",
    contentType: "application/json",
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        console.log(XMLHttpRequest.status);
    },
    success: function() {
        console.log('success');
    }
});

$.ajax({
    type: "POST",
    url: "Home/Post",
    dataType: "json",
    contentType: "application/json",
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        console.log(XMLHttpRequest.status);
    },
    success: function() {
        console.log('success');
    }
});

GET-Request 返回403 Forbidden , POST-Request 返回400 Bad Request

在此处输入图像描述

为什么 POST-Request 也不返回403 Forbidden 如果我没有设置dataTypecontentType ,那么 POST-Request 也会返回403 Forbidden

特别是我还想在 JSON-Ajax 调用上处理403 Forbidden401 Unauthorized 我怎样才能做到这一点?

如果我没有设置 dataType 和 contentType,那么 POST-Request 也会返回 403 Forbidden。

这是弄清楚发生了什么的关键。 您正在将内容类型设置为 application/json,但您发送的是一个空正文。 空体无效 JSON

在 ASP.NET 中,内容协商(反序列化您的输入的位。在 controller 主体之前运行。如果失败,则取决于失败的来源,它将为 400 或 405。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM