在我目前正在开发的 Web 应用程序中,要求所有用户都经过身份验证。目前,这是通过使用 AuthorizeFilter
来处理的。
我现在需要能够对应用程序的不同部分应用不同的授权策略,因此我想从使用全局授权过滤器切换到设置回退策略(如官方 documentation 中所述和推荐的那样) ).
这按预期工作,除了对不存在的资源的请求现在返回 HttpStatusCode 401
如果未通过身份验证,或 403
如果已通过身份验证但有其他要求未实现(我们在默认/回退策略中有一些)。以前,使用授权过滤器解决方案时,将返回 404
。我猜原因是回退策略在管道中比授权过滤器更早被评估,但它仍然是我想避免的副作用。
(如何)在使用 FallbackPolicy
时,我能否让应用程序像以前一样返回 404
?我想如果应用程序使用 net5.0
(或更高版本)我可以使用自定义 IAuthorizationMiddlewareResultHandler
,但升级不在短期计划中,这意味着解决方案必须适用于 netcoreapp3 .1
。
最佳答案
我在使用 netcoreapp3.1
时通过添加扩展 DenyAnonymousAuthorizationRequirement
的自定义授权处理程序设法获得了我想要的结果:
public class CustomDenyAnonymousAuthorizationRequirement : DenyAnonymousAuthorizationRequirement
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DenyAnonymousAuthorizationRequirement requirement)
{
if (context.Resource != null)
{
return base.HandleRequirementAsync(context, requirement);
}
context.Succeed(requirement);
return Task.CompletedTask;
}
}
如果没有资源,此代码只是将要求标记为已满足。
像这样添加服务集合:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton<IAuthorizationHandler, CustomDenyAnonymousAuthorizationRequirement>();
}
如果使用 net5.0+
,可以使用自定义 IAuthorizationMiddlewareResultHandler
来完成相同的任务:
public class CustomAuthorizationMiddlewareResultHandler : IAuthorizationMiddlewareResultHandler
{
private readonly AuthorizationMiddlewareResultHandler _defaultHandler = new();
public async Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
{
if ((authorizeResult.Challenged || authorizeResult.Forbidden) && context.GetEndpoint() == null)
{
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
return;
}
await _defaultHandler.HandleAsync(next, context, policy, authorizeResult);
}
}
并添加到服务集合中:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton<IAuthorizationMiddlewareResultHandler, CustomAuthorizationMiddlewareResultHandler>();
}
关于c# - 如何使用 AuthorizationOptions 中设置的 FallbackPolicy 为不正确的 url 返回 HttpStatusCode 404?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71252395/