【问题标题】:Sending a http response through a custom attribute in dotnet通过 dotnet 中的自定义属性发送 http 响应
【发布时间】:2020-12-31 16:46:36
【问题描述】:

我正在 dotnet 中创建一个自定义属性,用于检查授权标头。如果它与一些硬编码的字符串相同,则应该通过,否则用户不应该能够使用指定的路由。

我认为我得到了正确的响应标头,但是如果失败,我不确定如何发送 HTTP 响应。

  public class CustomAuthorization : ActionFilterAttribute
  {
    public override void OnActionExecuted(ActionExecutedContext context)
    {
              var httpContext = context.HttpContext;
              string authHeader = httpContext.Request.Headers["Authorization"];

         if(authHeader == "Kawaii") 
         {
             return;
             //do nothing cause its fine
         }
         else
         {
             httpContext.Response.WriteAsync("The authorization header was incorrect, is should be Kawaii");    
         }
     }
}

任何帮助将不胜感激!

【问题讨论】:

  • 先让请求通过并在请求完成后检查身份验证是很尴尬的……你能解释一下你为什么决定这样做吗?
  • 我当时并不知道自己在做什么。它不应该那样做。

标签: c# .net custom-attributes


【解决方案1】:

根据您的描述,听起来您应该使用OnActionExecuting 而不是OnActionExecuted。在正文中,您将context.Result 设置为代表响应的ActionResult,而不是写入context.HttpContext.Response

public class CustomAuthorization : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        string authHeader = context.HttpContext.Request.Headers["Authorization"];

        if(authHeader == "Kawaii")
            return;

        context.Result = new UnauthorizedResult();
    }
}

但是,这种方法听起来更适合 AuthorizationFilter 而不是 ActionFilter。查看filter pipeline documentation 了解不同类型过滤器的列表以及它们的作用。

【讨论】:

  • 非常感谢!我会试试这个并发布更新。
猜你喜欢
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多