Identity-layout-renderer ничего не отображает для. NET Базовое консольное приложение - PullRequest
2 голосов
/ 19 февраля 2020

У меня есть приложение. NET Core Console.

вот так:

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp2.1;netcoreapp3.1</TargetFrameworks>
  </PropertyGroup>

Я работаю на Windows 10 с VS 2019.

Я не могу заставить приведенное ниже средство визуализации макета что-либо регистрировать.

https://github.com/NLog/NLog/wiki/Identity-layout-renderer

${identity:authType=Boolean:separator=String:name=Boolean
          :isAuthenticated=Boolean}

Мой пример nlog.config

<?xml version="1.0" encoding="utf-8" ?>
<!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema-->
<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"
      internalLogFile="MyApp.NLog.INTERNAL.log"
      internalLogLevel="Info" >

  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file -->
    <target xsi:type="File" name="target1" fileName="MyApp.NLog.${shortdate}.log"
            layout="${date}|${level:uppercase=true}|${logger}|***|${identity:authType=true:separator=/:name=true:isAuthenticated=true}|****|${message} ${exception:format=toString,Data}|${all-event-properties}" />

  </targets>



  <!-- rules to map from logger name to target -->
  <rules>
    <logger name="*" minlevel="Trace" writeTo="target1" />
  </rules>
</nlog>

log:: (

2020/02/19 12:03:40.617|INFO|MyCompany.MyObject|***||****|HeyYouThere |

Ничего между *** || ****: (

и выводом внутреннего журнала nlog (MyApp.NLog.INTERNAL.log) (без ошибок)

2020-02-19 12:03:38.3612 Info Auto loading assembly file: c:\myfolder1\myfolder2\bin\Debug\netcoreapp3.1\NLog.Extensions.Logging.dll
2020-02-19 12:03:38.3734 Info Loading assembly file: c:\myfolder1\myfolder2\bin\Debug\netcoreapp3.1\NLog.Extensions.Logging.dll
2020-02-19 12:03:38.3847 Info NLog.Extensions.Logging, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 1.6.1.1203. Product version: 1.6.1.
2020-02-19 12:03:38.3847 Info Auto loading assembly file: c:\myfolder1\myfolder2\bin\Debug\netcoreapp3.1\NLog.Extensions.Logging.dll succeeded!
2020-02-19 12:03:38.3847 Info Auto loading assembly file: c:\myfolder1\myfolder2\bin\Debug\netcoreapp3.1\NLog.WindowsIdentity.dll
2020-02-19 12:03:38.3847 Info Loading assembly file: c:\myfolder1\myfolder2\bin\Debug\netcoreapp3.1\NLog.WindowsIdentity.dll
2020-02-19 12:03:38.3938 Info NLog.WindowsIdentity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 4.6.8.10751. Product version: 4.6.8.
2020-02-19 12:03:38.3938 Info Auto loading assembly file: c:\myfolder1\myfolder2\bin\Debug\netcoreapp3.1\NLog.WindowsIdentity.dll succeeded!
2020-02-19 12:03:38.3938 Info Message Template Auto Format enabled
2020-02-19 12:03:38.4652 Info Adding target FileTarget(Name=target1)
2020-02-19 12:03:38.5111 Info Found 39 configuration items
2020-02-19 12:03:38.5614 Info Configuration file change detected! Reloading in 1000ms...
2020-02-19 12:03:38.5614 Info Configuration file change detected! Reloading in 1000ms...
2020-02-19 12:03:39.5688 Info Reloading configuration...
2020-02-19 12:03:39.5688 Info Configuring from an XML element in c:\myfolder1\myfolder2\bin\Debug\netcoreapp3.1\nlog.config...
2020-02-19 12:03:39.5688 Info Message Template Auto Format enabled
2020-02-19 12:03:39.5688 Info Adding target FileTarget(Name=target1)
2020-02-19 12:03:39.5688 Info Closing old configuration.
2020-02-19 12:03:39.5987 Info Found 39 configuration items

Пакеты Nuget

  <ItemGroup>
    <PackageReference Include="NLog" Version="4.6.8" />
    <PackageReference Include="NLog.Extensions.Logging" Version="1.6.1" />
    <PackageReference Include="NLog.WindowsIdentity" Version="4.6.8" />
  </ItemGroup>

Насколько я вижу, похоже, у меня есть пакет Nuget

.nuget\packages\nlog\4.6.8\lib\netstandard2.0\NLog.dll
namespace NLog.LayoutRenderers
{
    [LayoutRenderer("identity")]
    public class IdentityLayoutRenderer : LayoutRenderer

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

Из ссылки (спасибо @granadaCoder)

NET Ядро имеет другое значение по умолчанию. Основная политика по умолчанию в. NET Core не является основной.

Если вы хотите сохранить. NET Поведение фреймворка, вызовите AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.UnauthenticatedPrincipal) в методе Main вашего приложения.

0 голосов
/ 20 февраля 2020

Таким образом, код в

https://github.com/NLog/NLog/blob/dev/src/NLog/LayoutRenderers/IdentityLayoutRenderer.cs

вот основной фрагмент кода:

    private static IIdentity GetValue()
    {
        var currentPrincipal = System.Threading.Thread.CurrentPrincipal;
        return currentPrincipal?.Identity;
    }

Когда я запускаю ниже (слегка отредактировано, просто чтобы посмотреть, что он делает)

        var currentPrincipal = System.Threading.Thread.CurrentPrincipal;
        var ident = currentPrincipal?.Identity;

идентул - ноль.

Так вот почему я ничего не получаю в лог-файле .......... ... код преобразуется в ноль.

goFigure

Итак, после небольшой домашней работы.

Thread.CurrentPrincipal преднамеренно пуст.

In ASP. NET CORE, можно было бы сделать что-то вроде этого (типичный inte rnet ответ, который я нашел)

Вы в основном пользуетесь преимуществами полного пересмотра Dependency Injection ....... и используете это .

А с DI-подходом НЕ НАДО полагаться на System.Threading.Thread.CurrentPrincipal; "быть рядом". (Продолжайте читать, чтобы обойти это)

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddTransient<IPrincipal>(
        provider => provider.GetService<IHttpContextAccessor>().HttpContext.User);

    // ...
}

С Do tNet .Core (консольное приложение) ... вам, вероятно, придется добавить один

псевдокод ниже

public void ConfigureServices(IServiceCollection services)
{
    ClaimsPrincipal myprinc = new ClaimsPrincipal(  /* you'll need a ClaimsIdentity and some claims here probably */ );

    //or
    GenericPrincipal myprinc = new GenericPrincipal ( /* you'll need GenericIdentity and some roles here probably */ );


    services.AddTransient<IPrincipal>(
        provider => myprinc);

    // ...
}

Так что это не проблема NLog. Вот как DotNetCore обрабатывает System.Threading.Thread.CurrentPrincipal; по-другому.

Вот хорошее чтение:

https://davidpine.net/blog/principal-architecture-changes/

Теперь для обходного пути:

Я проверил, что если я сделаю это:

AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal);

var currentPrincipal = System.Threading.Thread.CurrentPrincipal;
var ident = currentPrincipal?.Identity;

я получу то, что я (раньше) ожидал!

и сообщение журнала.

2020/02/19 12:03:40.617|INFO|MyCompany.MyObject|***|MyDomain\MyUserName|****|HeyYouThere |

Мне нужно запустить на моем linux поле, чтобы увидеть, что происходит (если я найду время) .. Может быть, исключение "не существует в текущем контексте" ??

Пожалуйста, не используйте "AppDomain.CurrentDomain.SetPrincipalPolicy" вслепую. Прочитайте статью Давидпайна о том, почему System.Threading.Thread.CurrentPrincipal; это старая школа. И DI, вероятно, лучший подход в будущем.

Также (если вы решите использовать):

Вот перечисление:

https://docs.microsoft.com/en-us/dotnet/api/system.security.principal.principalpolicy?view=netcore-3.1

Поля

NoPrincipal 1 Не следует создавать объекты принципала или идентификационные данные.

UnauthenticatedPrincipal 0 Объекты идентификатора и идентификационные данные для объекта, не прошедшего проверку подлинности, должны быть созданы. Для объекта, не прошедшего проверку подлинности, для свойства Name установлено пустое значение (""), а для IsAuthenticated установлено значение false.

WindowsPrincipal 2 Объекты-участники и удостоверения, отражающие маркер операционной системы, связанный с текущим потоком выполнения, должны быть созданы, а связанные группы операционной системы должны быть сопоставлены с ролями.

Необходимо учитывать каждое из значений. И вам следует рассмотреть вопрос «что происходит с linux», если вам это нужно.

Это произойдет?

"'Windows Основные функции не поддерживаются на эта платформа. '"

...