2017-05-23 91 views
1

我有一个AuthorizationHandler,我想返回一个自定义的StatusCode(或文字),现在我只是想使它返回429(这是速率限制,但是这是不相关)AuthorizationPolicy设置状态代码

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 
{ 
} 

,你可以看到,我试图设置状态= 429 _accessor.HttpContext.Response.StatusCode = 429;

我一直在使用从var filterContext = context.Resource as AuthorizationFilterContext;的HTTP上下文,然后filterContext.HttpContext

试图创建我的策略如下

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

代码运行并保护标记[Authorize(Policy = "ReCaptcha")]路线,但是状态始终是400,除非我抛出一个异常。

回答

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); 
}); 
1

假设你要覆盖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); 
      } 
     } 
    } 
+0

我可以看到这是如何工作的,但我宁可不要从抛出一个异常,我的'处理程序'。让我们看看别的进来 - 谢谢 –

+0

当错误被募集'HandleRequirementAsync'全局事件过滤器不火。 –