首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure事件网格- Azure功能的事件交付安全性

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

Stack Overflow用户
提问于 2018-06-18 21:10:39
回答 1查看 515关注 0票数 2

我一直在做一个与Azure事件网格与Azure函数集成相关的POC。我被事件交付安全卡住了,正如前面提到的here

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

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

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

代码语言:javascript
复制
[FunctionName("EventGridFunc")]
 public static void Run([EventGridTrigger]EventGridEvent eventGridEvent, 
 TraceWriter log)
 {
   log.Info("Received a trigger.");
   log.Info(eventGridEvent.Data.ToString());
 }
EN

回答 1

Stack Overflow用户

发布于 2018-06-18 22:53:20

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

代码语言:javascript
复制
https://{FunctionAppName}.azurewebsites.net/admin/extensions/EventGridExtensionConfig?functionName={EventGridTriggerFunctionName}&code={masterKey}

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

更新:

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

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

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

代码语言:javascript
复制
#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);    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50910326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档