Как получить специальный веб-крючок на веб-сайте IIS?

Вот что я сделал:

1 - Я установил пакет nuget: Microsoft.AspNet.WebHooks.Receivers.Custom 1.2.0-beta

2 - я настроил WebApiConfig чтобы получить пользовательские веб-хуки:

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.InitializeReceiveCustomWebHooks(); //<<<---
    }

3 - Я установил секретный ключ в файле web.config:

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    ...
    <add key="MS_WebHookReceiverSecret_GenericJson" value="z=SECRET"/> 
  </appSettings>

4 - я написал базовый приемник (с перехватом genericjson)

public class GenericJsonWebHookHandler : WebHookHandler
{
    public static string dataReceived;
    public GenericJsonWebHookHandler()
    {
        this.Receiver = "genericjson";
    }

    public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
    {
        // Get JSON from WebHook
        JObject data = context.GetDataOrDefault<JObject>();

        if (context.Id == "i")
        {
            // do stuff
        }
        else if (context.Id == "z")
        {
            // do more stuff
            dataReceived = data.ToString();

            File.Create(@"c:\test\test1.txt");
        }

        return Task.FromResult(true);
    }
}

Теперь можно ожидать, что с помощью описанных выше шагов, если отправитель веб-крюка настроен на публикацию Json на размещенный сайт IIS, он должен записать уведомление как Json, назначить захваченные данные dataReceived и написать пустой текстовый файл c:\test\test.txt - чего не было

В настоящее время я тестирую это с помощью Team Foundation Server, чтобы отправить тест веб-крюка https://mywebbhooksite.com:5050/?z=SECRET, и это успешно - однако, когда я проверяю, был ли создан этот маленький тестовый файл, его там нет. У меня также есть некоторый javascript, работающий на домашней странице, чтобы опросить любые изменения в dataReceived но я вижу, что ничего не происходит.

Упоминание здесь: у меня есть удаленный отладчик, подключенный к процессу w3wp.exe, точка останова на ExecuteAsync и GenericJsonWebHookHandler не получает удар

Существуют ли какие-либо другие конкретные настройки, которые необходимо выполнить, чтобы захватить веб-крючок?

1 ответ

Решение

Я выбрал грязный подход, который работает

Я угробил GenericJsonWebHookHandler и вместо этого я использовал Application_BeginRequest() событие в WebApiApplication вместо этого перехватить данные, отправленные отправителем Webhook. Тело крючка находится в HttpRequest.Request.Inputstream, который можно открыть с помощью потокового ридера. Содержимое можно прочитать на string и анализируется в JObject (если тело запроса, отправленного запросом webhook, является JSon)

Вот мой код

    protected void Application_BeginRequest()
    {
        if (!Request.HttpMethod.Equals("post", StringComparison.InvariantCultureIgnoreCase)) {
            return; 
        }

        string documentContents;
        using (var receiveStream = Request.InputStream)
        {
            using (var readStream = new StreamReader(receiveStream, Encoding.UTF8))
            {
                documentContents = readStream.ReadToEnd();
            }
        }

        try
        {
            var json = JObject.Parse(documentContents);
            File.WriteAllLines(@"C:\test\keys.txt", new[] { documentContents, "\r\n", json.ToString() });
        }
        catch (Exception)
        {
             // do something
        }
    }

Тест:

Я пошел на свой веб-крючок и начал тест веб-крюка. Он опубликовал запрос с JSON. HTTP 200 был ответ от сервера.

Точка останова была достигнута. HttpMethod взял пост. Запрос InputStream был прочитан и сохранен в documentContents, JObject.Parse выстрелил и поместил содержимое поста в JObject переменная называется json

Содержание json был записан в файл, хранящийся на сервере, что указывает на то, что запрос был получен правильно.

Что я планирую сделать, чтобы улучшить это, для безопасности

В целях безопасности я зашифрую секретный ключ, который я установил в файле web.config, и вместо этого установлю зашифрованный ключ в файле web.config, а после этого сопоставлю его с параметрами входящего URL-запроса (используя тот же алгоритм шифрования), чтобы увидеть если этот ключ присутствует и точно такой же

Другие вопросы по тегам