【问题标题】:AuthorizationPolicy set status codeAuthorizationPolicy 设置状态码
【发布时间】:2017-05-23 13:10:03
【问题描述】:

我有一个AuthorizationHandler,我现在想返回一个自定义状态码(或文本),我只是想让它返回 429(这是用于速率限制,但不相关)

public class ReCaptchaHandler : AuthorizationHandler<ReCaptchaRequirement>
{
    private readonly ReCaptcha _reCaptcha;
    private readonly IHttpContextAccessor _accessor;

    public ReCaptchaHandler(ReCaptcha reCaptcha, IHttpContextAccessor accessor)
    {
        _reCaptcha = reCaptcha;
        _accessor = accessor;
    }
    protected override  Task HandleRequirementAsync(AuthorizationHandlerContext context,
        ReCaptchaRequirement requirement)
    {

        context.Fail();
        _accessor.HttpContext.Response.StatusCode = 429;
        return Task.CompletedTask;
    }
}

public class ReCaptchaRequirement :  IAuthorizationRequirement
{
}

如您所见,我正在尝试将 status = 429 设置为 _accessor.HttpContext.Response.StatusCode = 429;

我尝试过使用var filterContext = context.Resource as AuthorizationFilterContext;filterContext.HttpContext 的http 上下文

我按如下方式创建我的策略

services.AddSingleton<IAuthorizationHandler, ReCaptchaHandler>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddAuthorization(options =>
{
    options.AddPolicy("ReCaptcha",
        policy => policy.Requirements.Add(new ReCaptchaRequirement()));
});

代码运行并保护标有[Authorize(Policy = "ReCaptcha")] 的路由,但状态始终为 400,除非我抛出异常。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core-mvc


    【解决方案1】:

    如果您将StatusCode 设置如下,则可以正常工作

    context.Fail();
    var Response = filterContext.HttpContext.Response;
    var message= Encoding.UTF8.GetBytes("ReCaptcha failed");
    Response.OnStarting(async () =>
    {
        filterContext.HttpContext.Response.StatusCode = 429;
        await Response.Body.WriteAsync(message, 0, message.Length);
    });
    

    【讨论】:

    • 非常感谢。你终于救了我。
    • 谢谢你,这对我有用,filterContext 的小改动如下: var filterContext= context.Resource as DefaultHttpContext;
    【解决方案2】:

    假设您想要覆盖 API 调用的异常代码,如果是这样,您是否尝试将新的异常过滤器添加到 MVC 配置过滤器,然后覆盖异常时的状态代码,类似这样。

    Startup.cs

    services.AddMvc(options =>
                {
                    options.Filters.Add(typeof(someExceptionFilter));
                })
    
    
    public class someExceptionFilter: IExceptionFilter
        {
            public someExceptionFilter()
            {
    
            }
            public void OnException(ExceptionContext context)
            {
                var exceptionType = context.Exception.GetType();
                if (exceptionType == typeof(yourException))
                {
                    context.ExceptionHandled = true;
                    var response = context.HttpContext.Response;
    
                    response.StatusCode = 429;
                    response.ContentType = "application/json";
                    //response.WriteAsync(context.Exception.Message);
                    context.Result = new JsonResult(context.Exception.Message);
                }
            }
        }
    

    【讨论】:

    • 我可以看到这是如何工作的,但我宁愿不必从我的 Handler 中抛出异常。让我们看看有没有其他东西进来。-谢谢
    • 当从HandleRequirementAsync 引发错误时,全局事件过滤器不会触发。
    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多