gpt4 book ai didi

Azure 事件网格 - Azure Function 的事件传递安全性

转载 作者:行者123 更新时间:2023-12-03 00:28:58 25 4
gpt4 key购买 nike

我一直在研究与 Azure 事件网格与 Azure Function 集成相关的 POC。我陷入了如上所述的事件传递安全性here .

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

但是我无法在函数代码中访问该参数。有人可以分享执行此操作的示例吗?

仅供引用 - 下面是我的代码中的函数定义。

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

最佳答案

EventGridTrigger 函数的完整订阅者 URL 具有以下格式:

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

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

更新:

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

  • 使用应用程序设置
  • 使用 Azure Key Vault 存储 secret
  • 使用 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 事件网格 - Azure Function 的事件传递安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50910326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com