当前位置: 首页 > 知识库问答 >
问题:

Azure事件网格——Azure功能的事件交付安全性

陆建木
2023-03-14

我一直在研究与Azure事件网格与Azure Function集成相关的POC。正如这里提到的,我被困在事件交付安全性上。

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

但我无法访问功能代码中的参数。有人能分享一下这样做的例子吗?

下面是我的代码中的函数定义

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

共有1个答案

宋智明
2023-03-14

EventGridTrigger函数的完整subscriberUrl具有以下格式:

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

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

更新:

我不知道如何在EventGridTrigger中获取查询字符串。但是,您的解决方案有一些变通方法,例如:

  • 使用应用程序设置
  • 使用 Azure 密钥保管库存储机密
  • 使用 HttpTrigger 而不是 EventGridTrigger

以下代码片段显示了 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);    
}
 类似资料:
  • azure event grid将捕获订阅中的VM创建和删除,并将Event Hub作为endpoint。但是部署失败,出现以下错误 指定的主题属性与事件订阅范围内的预期主题不匹配。 有什么想法吗?提前致谢 }

  • 因此,使用VS2019,我创建了一个Blob触发函数(v2),并针对Blob存储(v2)将其部署到Azure。如果我上传一个文件,该函数将被执行,blob存储中的文件将被成功处理。这里一切都好。 我现在希望创建一个Azure事件网格订阅(通过Azure门户)来附加到触发器和存储,但是,我看不到函数名称。 选择订阅后,请选择资源组 以前有人面对过吗?我希望在这个问题上有任何见解。 谢啦

  • 我已经实现了一个EventGrid触发器来响应Blob存储事件,其逻辑简化如下: 外部API的响应时间不长(1秒或更短),我对主机的配置设置为默认(因此允许无限数量的并发调用)。 当同时添加多个blob(从只有2个blob开始)时,我在日志中得到了很多重复的事件(脚本正在快速地一个接一个地上传blob,中间没有等待时间)。 我觉得这可能是由于我从不承认收到事件,我不知道我是否应该在我的代码中执行此

  • 我正试图开发一个Azure函数来处理由事件中心的捕获功能创建的blob。然而,尽管捕获blobs被正确地存储在容器中,但似乎没有< code>Microsoft。EventHub . capturefile created 事件发布到函数订阅。功能endpoint的事件订阅已创建,没有错误,Azure CLI的输出为 该函数的主体是一个标准的Http触发器,其中包含事件网格endpoint订阅所需

  • 我试图理解在Azure Function v2函数中使用EventGridTrigger时EventGrid的行为。此页面(在MS官方文档中)详细说明了与事件处理程序返回的状态代码相关的特定行为,但没有具体说明正在使用什么类型的事件处理程序。基于状态代码的使用,我只能假设它是用于webhook的。但是,Azure门户中的订阅配置具有Azure功能的事件处理程序。使用此事件处理程序时,如何从azur

  • 我正在使用Azure Portal在我的Blob存储帐户上创建一个新的事件网格订阅。 配置“endpoint详细信息”部分时,我指定endpoint类型是Azure函数。当提示选择要订阅的函数时,我无法指定该函数位于哪个部署槽中。 插槽下拉列表中唯一可用的项目是“生产”。但是我已经验证了该函数包含的不仅仅是一个默认插槽。信息图标显示以下内容: 我理解这是 Azure 门户的一个限制,并试图通过打开