在ASP.net core中创建自定义验证属性

3

我想使用属性来确保我的请求中存在某些标头。这不是一个授权属性。其中一个用例是当收到请求时,我想确保旧客户端的X-Request-For标头已被正确处理。还有其他用例,但所有用例都围绕着读取特定的HTTP标头值并在控制器接管之前采取适当的操作。

[MyAttribute(HeaderOptions.RequestFor)
[httpPost]
public MyMethod(string data) 
{
...
}
1个回答

9
你可以使用 MVC过滤器 来创建这样的属性。
例如,可以创建以下过滤器:
public class CheckHeaderFilter : Attribute, IResourceFilter
{
    private readonly string[] _headers;

    public CheckHeaderFilter(params string[] headers)
    {
        _headers = headers;
    }

    public void OnResourceExecuting(ResourceExecutingContext context)
    {
        if (_headers == null) return;
        
        if (!_headers.All(h => context.HttpContext.Request.Headers.ContainsKey(h)))
        {
            //do whatever you need to do when check fails
            throw new Exception("Necessary HTTP headers not present!");
            
        }
    }

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        
    }
}

然后在操作(或控制器)上使用它:
[CheckHeaderFilter(HeaderOptions.RequestFor)]
public IActionResult Index()
{
   ...
}

我强烈建议您阅读文档,以了解应使用哪种类型的筛选器。在此示例中,我使用了ResourceFilter,因为它在管道中相对较早(在授权之后和模型绑定之前 - 这对于您的情况很有意义)。
但是,根据您需要执行的操作,您应该使用适当的筛选器。

工作良好,但返回给客户端的是500状态码而不是4xx,因为这是客户端错误。 - ewhoambra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接