首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AuthorizationPolicy集状态码

AuthorizationPolicy集状态码
EN

Stack Overflow用户
提问于 2017-05-23 13:10:03
回答 2查看 3.6K关注 0票数 9

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

代码语言:javascript
运行
复制
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
{
}

如您所见,我正在尝试使用_accessor.HttpContext.Response.StatusCode = 429;设置状态= 429

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

我创建的策略如下

代码语言:javascript
运行
复制
services.AddSingleton<IAuthorizationHandler, ReCaptchaHandler>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddAuthorization(options =>
{
    options.AddPolicy("ReCaptcha",
        policy => policy.Requirements.Add(new ReCaptchaRequirement()));
});

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-23 14:19:41

如果按以下方式设置StatusCode,它就会工作

代码语言:javascript
运行
复制
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);
});
票数 15
EN

Stack Overflow用户

发布于 2017-05-23 13:23:57

假设您想要覆盖API调用的异常代码,如果是这样的话,您是否尝试向MVC配置筛选器中添加一个新的异常筛选器,然后在异常上重写状态代码,如下所示。

Startup.cs

代码语言:javascript
运行
复制
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);
            }
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44135817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档