我正在开发一个独立的.Net Core API目标框架.Net Core 2.2。
身份验证方案是JWTBearerTokens,它连接到我们的ADFS Identify服务器。
当我调用装饰有[Authorize]属性的API终端时,我收到401未经授权的响应,这是预期的和默认的行为。
我接下来要做的是,不是让同一个调用返回401,而是将状态代码返回为404。(我不想深入探讨404原因的原因。简单地说,我不想如果请求中未包含有效令牌,则表明端点存在)
在以前的.Net Framework WebAPI中,您可以创建自己的属性,并覆盖HandleUnauthorizedRequest方法并返回所需的状态代码。
我已经查看了有关基于策略的授权的文档,但是没有尝试过该示例或尝试实施该示例。如果未满足策略,则策略处理程序看起来与处理(返回成功或失败)有更多关系。我看不到任何地方都可以在失败时返回其他状态代码。因此,只有在我开始对照实际政策进行检查时,这才有意义。
有什么见解吗?
答案 0 :(得分:0)
返回404而不是401是不好的做法(如@Chris Pratt的评论中所述),必须避免。考虑这些情况,
无论如何,作为社区的一部分,我会给你答案...
将此添加到您的global.asax
void Application_EndRequest(object source, System.EventArgs args)
{
if (Response.StatusCode == 401)
{
Response.ClearContent();
Response.RedirectToRoute("ErrorH", (RouteTable.Routes["ErrorH"] as Route).Defaults);
}
}
然后在routeConfig中,为您的errorHandler创建一条路由:
routes.MapRoute(
"ErrorH",
"Error/{action}/{errMsg}",
new { controller = "CustomController", action = "Change401To404", errMsg = UrlParameter.Optional }
);
在您的自定义控制器中:
public class CustomController : Controller //or Base
{
public ActionResult Change401To404(){
//Do whatever you want
}
}
PS:这不是唯一的方法,还有许多其他方法可以做到。但是至少在这种方法中,您可以将实际的404响应与401响应区分开。