.Net Core API返回405:具有Authorize属性时不允许使用方法

Ben*_*min 2 c# asp.net-mvc .net-core asp.net-core identityserver4

我有一个 Asp.NET Core MVC 应用程序,它Controller总是从View. 我现在通过公开新的 API 端点来扩展应用程序,该端点可以像 Postman 一样从外部调用。

405 - Method Not Allowed当我将[Authorize]属性放在控制器顶部时,我遇到了获取问题。如果没有此属性,我可以到达端点,并且模型将按预期与我从邮递员提供的值绑定。

下面是我的控制器的样子:

[Authorize]
[Route("api/v1/auth")]
public class ApiAuthController : Controller
{
    [HttpPost("changePassword")]
    public async Task<IActionResult> ChangePassword([FromBody] ChangePasswordModel model)
    {
        return null;
    }

} 
Run Code Online (Sandbox Code Playgroud)

值得一提的是,这个应用程序与提供承载令牌的应用程序是同一个应用程序,我稍后在邮递员中使用它。

下面是邮递员: 在此输入图像描述

在此输入图像描述

在我的Startup.cs文件中,我有以下与IdentityServer和相关的设置Authorization

        services
            .AddIdentityServer(options =>
            {
                options.Events.RaiseErrorEvents = true;
                options.Events.RaiseInformationEvents = true;
                options.Events.RaiseFailureEvents = true;
                options.Events.RaiseSuccessEvents = true;
            })
            .AddSigningCredential(cert)
            .AddAspNetIdentity<IdentityUser>()               
            .AddAuthentication()
Run Code Online (Sandbox Code Playgroud)

sch*_*nyw 7

您似乎未经过身份验证,并且 IdentityServer 正在尝试将您重定向到登录页面或访问拒绝页面,因此出现 302 响应。同时,Postman 处理 302 的方式与大多数 Web 浏览器不同,它遵循重定向但保留 POST 方法(而不是更改为 GET)。这会导致向登录页面发出 POST 请求,最终导致 405 Method Not allowed 响应。

在大多数 Web 浏览器中不应发生这种情况,因为它们会在收到 302 响应后将 HTTP 方法更改为 GET。但要为不执行此操作的浏览器或用户代理解决此问题,您可以尝试:

services.ConfigureApplicationCookie(options =>
{
    options.Events.OnRedirectToAccessDenied =
        options.Events.OnRedirectToLogin = context =>
        {
            if (context.Request.Method != "GET")
            {
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                return Task.FromResult<object>(null);
            }
            context.Response.Redirect(context.RedirectUri);
            return Task.FromResult<object>(null);
        };
});
Run Code Online (Sandbox Code Playgroud)

当方法不是 GET 时,这应该发送 401 Unauthorized 响应而不是 302 响应。