Таким образом, код в
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 Основные функции не поддерживаются на эта платформа. '"