Как получить user_authenticatedID в приложении Insights for Azure Functions App? - PullRequest
0 голосов
/ 12 марта 2020

Я пролистал несколько разных ресурсов, чтобы добавить это, но, похоже, это не работает. Я хотел бы записать аутентифицированного пользователя как запрос к моей функции Azure. Я могу получить аутентифицированного пользователя из принципала утверждений. Я следовал за документами, чтобы внедрить конфигурацию телеметрии и создать экземпляр TelemetryClient с этой конфигурацией. Я проверяю утверждения, чтобы увидеть, являются ли они нулевыми, и если нет, я устанавливаю TelemetryClient.Context.User.AuthenticatedId = самому требованиюPrincipal.Identity.Name. Однако в журналах я не вижу заполненного поля.

class{
   private readonly TelemetryClient tc;
   public classConstructor(TelemetryConfiguration config){
      tc = new TelemetryClient(congig)
   }


    public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "Get", Route = 
    "user/session")] HttpRequest req, ILogger log, ClaimsPrincipal claimsPrincipal){

            //null check on claimsprincipal
            tc.Context.User.UserAuthenticatedId = claimsPrincipal?.Identity?.Name;

   }

startup class{
      builder.Services.AddSingleton<TelemetryConfiguration>(provider =>
           var telemetryConfiguration = new TelemetryConfiguration();
           telemetryConfiguration.instrumentationKey = "key"
           return telemetryConfiguration;
}

1 Ответ

0 голосов
/ 13 марта 2020

Я не уверен, где вы хотите показать TelemetryClient.Context.User.AuthenticatedId.

Если вы хотите увидеть его в журналах, вам нужно добавить:

log.LogInformation(tc.Context.User.AuthenticatedUserId);

Если вы хотите увидеть его в обзорах приложений, вам нужно использовать TrackTrace или TrackEvent :

tc.TrackEvent("---------track-event" + tc.Context.User.AuthenticatedUserId);
tc.TrackTrace("---------track-trace" + tc.Context.User.AuthenticatedUserId);

Затем вы можете увидеть их в обзоре приложений (как показано на скриншоте ниже) enter image description here

Вот мой код для справки:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
using System.Security.Claims;
using ikvm.runtime;
using Microsoft.Azure.WebJobs.Hosting;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;

namespace FunctionApp6
{
    public class Function1
    {
        private readonly TelemetryClient tc;

        public Function1(TelemetryConfiguration config)
        {
            this.tc = new TelemetryClient(config);
        }

        [FunctionName("Function1")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log, ClaimsPrincipal claimsPrincipal)
        {

            tc.Context.User.AuthenticatedUserId = "---userid---";

            log.LogInformation(tc.Context.User.AuthenticatedUserId);
            tc.TrackEvent("---------track-event" + tc.Context.User.AuthenticatedUserId);
            tc.TrackTrace("---------track-trace" + tc.Context.User.AuthenticatedUserId);

            string responseMessage = "This HTTP triggered function executed successfully";

            return new OkObjectResult(responseMessage);
        }

        public class MyStartup : IWebJobsStartup
        {
            public void Configure(IWebJobsBuilder builder)
            {
                var configDescriptor = builder.Services.SingleOrDefault(tc => tc.ServiceType == typeof(TelemetryConfiguration));
                if (configDescriptor?.ImplementationFactory != null)
                {
                    var implFactory = configDescriptor.ImplementationFactory;
                    builder.Services.Remove(configDescriptor);
                    builder.Services.AddSingleton(provider =>
                    {
                        if (implFactory.Invoke(provider) is TelemetryConfiguration config)
                        {
                            var newConfig = TelemetryConfiguration.CreateDefault();
                            newConfig.ApplicationIdProvider = config.ApplicationIdProvider;
                            newConfig.InstrumentationKey = config.InstrumentationKey;

                            return newConfig;
                        }
                        return null;
                    });
                }
            }
        }
    }
}
...