c# - 如何使用 AuthorizationOptions 中设置的 FallbackPolicy 为不正确的 url 返回 HttpStatusCode 404?

标签 c# .net-core asp.net-web-api authorization

在我目前正在开发的 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/

相关文章:

c# - 将转换转换为 RectTransform

c# - 显示错误页面 MVC

c# - 如何使用 EPPlus 在多个工作表上书写

.net - dotnet发布包含额外的文件

javascript - 从 Javascript 调用 PUT 方法

c# - 如何将字符串数组从 AngularJS 传递到 C# web api?

c# - 使用 log4net 的 RichTextBoxAppender

c# - 使用 HtmlAgilityPack.NETCore 获取网页

c# - 带有嵌套对象的 Json,每个都有不同的名称

asp.net - 如何在 Web API 中使用两个参数构建 Get