AuthorizationPolicy设置状态码

Ste*_*ake 4 c# asp.net-mvc asp.net-core-mvc

我有一个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
{
}
Run Code Online (Sandbox Code Playgroud)

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

我尝试使用http上下文var filterContext = context.Resource as AuthorizationFilterContext;,然后filterContext.HttpContext

我按照以下方式创建我的政策

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

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

Ste*_*ake 6

如果您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);
});
Run Code Online (Sandbox Code Playgroud)