【发布时间】:2018-07-16 18:47:43
【问题描述】:
我一直在使用CookieAuthenticationHandler,但通过访问由具有Authorize 属性的控制器方法处理的视图而未能获得授权。
CookieAuthenticationHandler 然后将我重定向到HandleForbiddenAsync 或HandleChallengeAsync 中的可配置路径(取决于它是身份验证还是授权)。但是,在重定向后,我注意到 HTTP 状态码丢失了。
我在控制器动作中添加了一个断点,该动作被重定向到,状态码为 200。
我期待一个不同的状态码(401 或 403)。
这就是HandleForbiddenAsync 中发生的事情(来自github):
protected override async Task HandleForbiddenAsync(AuthenticationProperties properties)
{
var returnUrl = properties.RedirectUri;
if (string.IsNullOrEmpty(returnUrl))
{
returnUrl = OriginalPathBase + Request.Path + Request.QueryString;
}
var accessDeniedUri = Options.AccessDeniedPath + QueryString.Create(Options.ReturnUrlParameter, returnUrl);
var redirectContext = new RedirectContext<CookieAuthenticationOptions>(Context, Scheme, Options, properties, BuildRedirectUri(accessDeniedUri));
await Events.RedirectToAccessDenied(redirectContext);
}
所以我实现了自己的HandleForbiddenAsync(使用扩展CookieAuthenticationHandler的自定义AuthenticationHandler),并尝试通过添加以下行直接设置状态码:
redirectContext.Response.StatusCode = StatusCodes.Status403Forbidden;
但是当我到达断点时,我仍然看到状态码 200。
我很可能以错误的方式处理事情。我想要完成的是在我的索引视图的控制器中获得不同的状态码。
有什么想法吗?
【问题讨论】:
-
我认为您可以通过简单的方式实现您想要的结果。当用户身份验证失败时,尝试在登录操作中返回 ForBidden()
标签: c# controller asp.net-core-mvc http-status-codes