NLog .NET Core aspnet-идентификатор пользователя всегда пуст - PullRequest
0 голосов
/ 19 октября 2018

Я прочитал кучу SO-сообщений с аналогичной тематикой, но ни одна из них не касается моей проблемы.

My nlog.config напоминает это:

<?xml version="1.0" encoding="utf-8"?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xsi:schemaLocation="NLog NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwExceptions="true"
      internalLogIncludeTimestamp="true"
      internalLogFile="nlog-internal.log"
      internalLogLevel="Error">
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>
  <targets>
    <target xsi:type="Database"
            name="database"
            commandType="Text"
            dbProvider="Npgsql.NpgsqlConnection, Npgsql"
            connectionString="${var:appDbConnectionString}"
            commandText="Layout">
      <commandText>
        insert into "logs" ("application", "user", "level", "message", "exception", "logger")
        values (@application, @user, @level, @message, @exception, @logger);
      </commandText>
      <parameter name="@application" layout="My App" />
      <parameter name="@user" layout="${aspnet-user-identity}" />
      <parameter name="@level" layout="${level}" />
      <parameter name="@message" layout="${message}" />
      <parameter name="@exception" layout="${exception:format=tostring}" />
      <parameter name="@logger" layout="${logger}" />
    </target>
  </targets>
  <rules>
    <logger name="MyApp.*" minlevel="Info" writeTo="database" final="true" />
    <logger name="*" minlevel="Error" writeTo="database" final="true"/>
    <logger name="*" minlevel="Warn" writeTo="database" final="true"/>
  </rules>
</nlog>

... my Startup.cs вызывает это в методе ConfigureServices():

services.AddLogging();

... my Startup.cs вызывает это в методе Configure():

var loggerFactory = app.ApplicationServices.GetService<ILoggerFactory>();
        LogManager.LoadConfiguration("nlog.config");
        LogManager.Configuration.Variables["appDbConnectionString"] =
            config["ConnectionStrings:ApplicationContext"];
        loggerFactory.AddNLog();

... my BuildWebHost(string[] args) в моем Program.cs имеет:

public static IWebHost BuildWebHost(string[] args)
{
    return WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseNLog()
        .Build();
}

Мой ClaimsPrincipal правильно заполнен и настроен для аутентифицированных пользователей, но я не могу заставить {aspnet-user-identity} быть чем-то иным, кроме пустого.

Что я делаю не так?

Я использую NLog 4.5.10, NLog.Extensions.Logging 1.3.0 и NLog.Web.AspNetCore 4.7.0;похоже, это последние библиотеки.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

ТАК КАК ВЫЯВЛЯЕТСЯ, что NLog реализует свой собственный локатор служб при использовании его с контейнерами IoC.Мне нужно было добавить строку примерно так:

app.ApplicationServices.SetupNLogServiceLocator();

... и волшебство произошло.Я должен был написать проблему в GitHub , но они ответили почти мгновенно

0 голосов
/ 22 октября 2018

Когда вы отлаживаете, User.Identity.Name разрешает что-либо?

Я столкнулся с этим и исправил его, добавив утверждение с ClaimTypes.Name в ClaimsPrincipal.У меня были все необходимые требования, но ClaimsIdentity искал конкретную заявку для создания имени.

...