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)
您似乎未经过身份验证,并且 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 响应。
| 归档时间: |
|
| 查看次数: |
2579 次 |
| 最近记录: |