【问题标题】:Azure Event Grid - Event Delivery Security at Azure FunctionAzure 事件网格 - Azure Function 的事件传递安全性
【发布时间】:2018-11-27 08:24:30
【问题描述】:

我一直在研究与 Azure 事件网格与 Azure Function 集成相关的 POC。我被困在here 提到的事件传递安全上。

我正在使用由 Azure Blob 存储中的内置事件网格订阅发送的事件网格触发器。如上述 URL 中所述,我在 WebHook 端点中添加了一个访问令牌作为查询参数。

但我无法在函数代码中访问该参数。有人可以分享一个这样做的样本吗?

仅供参考 - 以下是我的代码中的函数定义。

[FunctionName("EventGridFunc")]
 public static void Run([EventGridTrigger]EventGridEvent eventGridEvent, 
 TraceWriter log)
 {
   log.Info("Received a trigger.");
   log.Info(eventGridEvent.Data.ToString());
 }

【问题讨论】:

    标签: azure azure-eventgrid


    【解决方案1】:

    EventGridTrigger 函数的完整subscriberUrl 格式如下:

    https://{FunctionAppName}.azurewebsites.net/admin/extensions/EventGridExtensionConfig?functionName={EventGridTriggerFunctionName}&code={masterKey}
    

    如您所见,EventGridTrigger 基本上是一个特殊的 HttpTrigger(推送)函数,对事件消息进行“隐藏预处理”以进行验证。

    更新:

    我没有看到如何在 EventGridTrigger 中获取查询字符串。但是,您的解决方案很少有解决方法,例如:

    • 使用应用程序设置
    • 使用 Azure Key Vault 存储机密
    • 使用 HttpTrigger 而不是 EventGridTrigger

    以下代码 sn-p 显示了 EventGrid(版本 2018-05-01-preview)订阅者的 HttpTrigger 函数示例:

    #r "Newtonsoft.Json"
    
    using System.Net;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using System.Linq;
    using System.Threading.Tasks;
    
    public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, IDictionary<string, string> query, TraceWriter log)
    {
        log.Info("C# HTTP trigger function processed an EventGrid request.");
    
        log.Info($"\nHeaders:\n\t{string.Join("\n\t", req.Headers.Where(i => i.Key.StartsWith("aeg-")).Select(i => $"{i.Key}={i.Value.First()}"))}");
        log.Info($"\nQuery:\n\t{string.Join("\n\t", query.Select(i => $"{i.Key}={i.Value}"))}");
    
        string eventGridValidationHeader = req.Headers.FirstOrDefault( x => string.Compare(x.Key,"Aeg-Event-Type", true) == 0).Value?.FirstOrDefault().Trim();
    
        // media type = application/json or application/cloudevents+json 
        string jsontext = null;
        var jtoken = JToken.Parse(await req.Content.ReadAsStringAsync());
        log.Info($"\n{jtoken.ToString(Newtonsoft.Json.Formatting.Indented)}");
    
        if (jtoken is JArray)
            jsontext = jtoken.SingleOrDefault<JToken>().ToString();
        else if (jtoken is JObject)
            jsontext = jtoken.ToString();
    
        var eventGridEvent = JsonConvert.DeserializeAnonymousType(jsontext, new { EventType = "", Data = new JObject()});
        if (string.IsNullOrEmpty(eventGridValidationHeader) || string.IsNullOrEmpty(eventGridEvent?.EventType) || eventGridEvent?.Data == null)
        {
            return req.CreateErrorResponse(HttpStatusCode.BadRequest, "No EventGrid message.");
        }
    
        if (eventGridValidationHeader == "SubscriptionValidation" && eventGridEvent.EventType == "Microsoft.EventGrid.SubscriptionValidationEvent")
        {
            log.Verbose(@"Event Grid Validation event received.");
            return req.CreateResponse(HttpStatusCode.OK, JsonConvert.DeserializeObject(JsonConvert.SerializeObject(new { validationResponse = ((dynamic)eventGridEvent.Data).validationCode })));               
        }
    
        #region Event Processing 
    
        // for testing a retry delivery policy 
        //return req.CreateResponse(HttpStatusCode.BadRequest, "Testing");
    
        #endregion
    
        return req.CreateResponse(HttpStatusCode.NoContent);    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 2018-03-17
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2021-04-21
      • 2021-02-18
      • 2019-12-23
      • 1970-01-01
      相关资源
      最近更新 更多