gpt4 book ai didi

c# - .Net 核心 API 返回 405 :Method not allowed when having Authorize attribute

转载 作者:行者123 更新时间:2023-12-02 00:09:54 27 4
gpt4 key购买 nike

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

当我将 [Authorize] 属性放在 Controller 顶部时,我遇到了获取 405 - Method Not Allowed 的问题。没有这个属性,我可以到达端点,并且模型会按预期受到我从 postman 提供的值的限制。

下面是我的 Controller 的样子:

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

}

可能值得一提的是,此应用程序与提供我稍后在 postman 中使用的 Bearer token 的应用程序相同。

下面是 postman : enter image description here

enter image description here

在我的 Startup.cs 文件中,我有以下与 IdentityServerAuthorization 相关的设置:

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

最佳答案

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

这在大多数网络浏览器中不应该发生,因为它们会在收到 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);
};
});

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

关于c# - .Net 核心 API 返回 405 :Method not allowed when having Authorize attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59408865/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com