NLog .NET Core aspnet用户身份始终为空

时间:2018-10-19 00:19:35

标签: c# asp.net-core nlog

我读过许多类似主题的SO帖子,似乎都没有解决我的问题。

我的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>

...我的Startup.cs通过ConfigureServices()方法调用此方法:

services.AddLogging();

...我的Startup.cs通过Configure()方法调用此方法:

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

...我的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;这些似乎是最新的库。

3 个答案:

答案 0 :(得分:1)

因此,事实证明,NLog与IoC容器一起使用时会实现自己的服务定位器。我需要这样添加一行:

app.ApplicationServices.SetupNLogServiceLocator();

...魔术发生了。我必须为此写一个issue in GitHub,但他们几乎立即做出了回应

答案 1 :(得分:1)

loggerFactory.AddNLog();是问题所在。

将program.cs更改为此:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder
                    .CaptureStartupErrors(true)
                    .UseIISIntegration()
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseStartup<Startup>()
                    .ConfigureLogging((hostingContext, logging) =>
                    {
                        //logging.AddNLog(); //<--- Can remove (NLog.Extensions.Logging)
                    })
                    ;
            })
            .UseNLog(); // <--- Call UseNLog off of IHostBuilder (NLog.Web)
}

请参阅https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3

答案 2 :(得分:0)

调试时,User.Identity.Name可以解决任何问题吗?

我遇到了这个问题,并通过在ClaimsPrincipal中添加带有ClaimTypes.Name的声明来解决。我拥有所需的所有声明,但是ClaimsIdentity正在寻找生成该名称的特定声明。