Как использовать ActionFilter на Prometheus mapPath в стандартном .Net Web API? - PullRequest
0 голосов
/ 27 января 2019

Я хочу отфильтровать диапазон IP-адресов клиентов, которые могут перенаправлять данные в метрики Prometheus. Так что при запуске у меня

    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);            
        app.UsePrometheusServer(q =>
        {
            q.MapPath = "/metrics";
        });
        app.UseWebApi(config);
    }

А это мой пользовательский класс actionFilter

public class IpFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext actionContext)
    {            
        string clinetIP = GetClientIpAddress(actionContext.HttpContext.Items["MS_HttpRequestMessage"] as HttpRequestMessage);
        if (IpAllowed(clinetIP))  
            base.OnActionExecuting(actionContext);
    }       

Но я понятия не имею, как использовать IpFilter, поскольку его нельзя использовать в качестве атрибута действия контроллера. Я попытался использовать его, добавив промежуточное программное обеспечение с помощью owin, но next.Invoke не работает должным образом

    public void Configuration(IAppBuilder app)
    {     
        app.Map("/metrics", metricsApp =>
        {             
           metricsApp.Use<TestIpMid>(deniedIps);
           metricsApp.UsePrometheusServer(q => q.MapPath = "/metrics");              
        });
        app.UsePrometheusServer(q =>
        {
            q.MapPath = "/metrics";
        });
        app.UseWebApi(config);
    }

и это промежуточное ПО:

    public class TestIpMid : OwinMiddleware
{
    private readonly HashSet<string> _deniedIps;

    public TestIpMid(OwinMiddleware next, HashSet<string> deniedIps) : base(next)
    {
        _deniedIps = deniedIps;
    }

    public override async Task Invoke(IOwinContext context)
    {
        var ipAddress = context.Request.RemoteIpAddress;
        if (_deniedIps.Contains(ipAddress))
        {
            context.Response.StatusCode = 403;
            return;
        }           
        await Next.Invoke(context);            
    }
}

пожалуйста, помогите мне: '(

1 Ответ

0 голосов
/ 27 января 2019

это решение работало для меня, но другие способы, о которых я думал, не работали

    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);

        var config = new HttpConfiguration();
        var allowedIps = ProtectedSettings.Read(ProtectedSettings.protheusIpWhitelist).Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);             
        app.Use(async (Context, next) =>
        {
            var ipAddress = Context.Request.RemoteIpAddress;
            if ((!allowedIps.Contains(ipAddress)) && Context.Request.Path.Value == "/metrics")
            {
                Context.Response.StatusCode = 403;
                return;
            }
            await next.Invoke();
        });
        app.UsePrometheusServer(q =>
        {
            q.MapPath = "/metrics";

        });
        app.UseWebApi(config);
    }
...