.Net Core 2.1 получение клиентских машин Windows имя пользователя - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь получить зарегистрированного пользователя в Windows на клиентском компьютере.Я пытался использовать User.Identity.Name & WindowsIdentity.GetCurrent (). Name.Когда я запускаю приложение локально через Visual Studio, оно отлично работает.Между тем, когда я публикую этот код на нашем сервере IIS, когда я запускаю этот код, он возвращает «NT AUTHORITY \ NETWORK SERVICE».

Я подумал, что это будет более простой задачей, и начал проходить кучуразличных поисков Google без удачи (возможно, это просто, что я новичок в ядре .net и я делаю глупую ошибку где-то).В любом случае, на моем сервере включена авторизация Windows (см. Изображение ниже).

Windows Authentication IIS

Проект представляет собой веб-приложение .net core 2.1, и я работаю в C #,Любая помощь с этим была бы отличной!

Примечание

Моя предыдущая тема (теперь удаленная) для этого вопроса была помечена как дублирующий вопрос ( Как получить текущийпользователь в ядре asp.net ) Я не понимаю, как это дубликат, когда в этом вопросе они говорят, что их HttpContext имеет значение null.У меня нет этой проблемы, я возвращаю пользователя, но это НЕ пользователь клиентского компьютера.В связи с этим мне пришлось воссоздать этот вопрос.Если есть повторяющийся ответ, пожалуйста, опубликуйте его в комментариях, дайте мне обзор, если он на самом деле совпадает, и если это так, то мы можем пометить его как дубликат.Спасибо.

Я также пытался использовать:

HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value

Это было предложено в ответном сообщении, но это просто дает мне нулевую ссылку.

Обновление # 1

Просто подумал, что я бы также добавил, что на моем сервере уже установлены следующие роли:

Windows Auth role installed

Обновление # 2

Вот метод получения имени пользователя, это страница бритвы index.cshtml, которая изначально загружена.

public async Task<IActionResult> OnGetAsync()
    {
        ILogger log = ApplicationLogger.CreateLogger("LoginFilter");
        log.LogError("Start");
        log.LogError("contextIdent: " + User.Identity.Name);
        log.LogError("windowsIdent: " + WindowsIdentity.GetCurrent().Name);
        log.LogError("environment: " + Environment.UserName);
        log.LogError("End");

        return Page();
    }

Это выводит следующее вжурнал стандартного вывода:

Hosting environment: Production
Content root path: C:\inetpub\wwwroot\MyApp
Now listening on: http://127.0.0.1:20316
Application started. Press Ctrl+C to shut down.
fail: LoginFilter[0]
      Start
fail: LoginFilter[0]
      contextIdent: NT AUTHORITY\NETWORK SERVICE
fail: LoginFilter[0]
      windowsIdent: NT AUTHORITY\NETWORK SERVICE
fail: LoginFilter[0]
      environment: MYENV$
fail: LoginFilter[0]
      End

Обновление # 3

Добавлено:

log.LogError("findFirst: " + User.FindFirst(ClaimTypes.NameIdentifier).Value);

После добавления этого журналасгенерировал следующее:

Hosting environment: Production
Content root path: C:\inetpub\wwwroot\MyApp
Now listening on: http://127.0.0.1:35812
Application started. Press Ctrl+C to shut down.
fail: LoginFilter[0]
      Start
fail: LoginFilter[0]
      contextIdent: NT AUTHORITY\NETWORK SERVICE
fail: LoginFilter[0]
      windowsIdent: NT AUTHORITY\NETWORK SERVICE
fail: LoginFilter[0]
      environment: MYENV$
fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
      An unhandled exception has occurred while executing the request.
System.NullReferenceException: Object reference not set to an instance of an object.
   at MyApp.Pages.IndexModel.OnGetAsync()
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.ExecutorFactory.GenericTaskHandlerMethod.Convert[T](Object taskAsObject)
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.ExecutorFactory.GenericTaskHandlerMethod.Execute(Object receiver, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.InvokeHandlerMethodAsync()
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.InvokeNextPageFilterAsync()
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.Rethrow(PageHandlerExecutedContext context)
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext context)

Обновление # 4

Я добавил в свой Startup.cs ConfigureServices следующее:

services.AddAuthentication(IISDefaults.AuthenticationScheme);

И вmy index.cshtml:

var user = WindowsIdentity.GetCurrent();
WindowsIdentity.RunImpersonated(user.AccessToken, () =>
{
    var impersonatedUser = WindowsIdentity.GetCurrent();
    log.LogError("impersonated: " + impersonatedUser.Name);
});

Как я и ожидал (из-за того, что пользователь, выдавший себя за олицетворение, все еще остается "NT AUTHORITY \ NETWORK SERVICE"), получим следующие результаты:

Hosting environment: Production
Content root path: C:\inetpub\wwwroot\MyApp
Now listening on: http://127.0.0.1:36547
Application started. Press Ctrl+C to shut down.
fail: LoginFilter[0]
      Start
fail: LoginFilter[0]
      impersonated: NT AUTHORITY\NETWORK SERVICE
fail: LoginFilter[0]
      contextIdent: NT AUTHORITY\NETWORK SERVICE
fail: LoginFilter[0]
      windowsIdent: NT AUTHORITY\NETWORK SERVICE
fail: LoginFilter[0]
      environment: MYENV$
fail: LoginFilter[0]
      hcIdent: NT AUTHORITY\NETWORK SERVICE
fail: LoginFilter[0]
      End
Application is shutting down...

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

В поисках решения Я наткнулся на этот сайт:

Удостоверения для разных конфигураций аутентификации IIS7

Просмотр различных имен удостоверений, которые используются в другом приложенииНастройки пула я решил попробовать поменять.Что меня подтолкнуло к этому, так это имя пользователя, которое я возвращал в своем коде ( NT AUTHORITY \ NETWORK SERVICE ), очень похоже на настройку Identity NetworkService .Поэтому я попытался загрузить страницу после изменения удостоверения пулов приложений на LocalSystem , и это решило мою проблему!

Ниже приведен снимок экрана с настройкой пула приложений, которую я изменил:

Application Pool Identity Setting

В любом случае, это решило мою проблему, надеюсь, это поможет кому-то, у кого может быть такая же проблема!

0 голосов
/ 20 ноября 2018

Я только что создал новый проект веб-приложения MVC ASP.NET Core 2.1 из шаблона в Visual Studio.Установил флажок «Аутентификация Windows» в мастере шаблонов и

добавлен User.Identity.Name

 public IActionResult Contact()
        {
            ViewData["Message"] = "User: " + User.Identity.Name; 

            return View();
        }

работает из коробки на компьютере разработчика.Вы столкнулись с проблемами только при переходе на рабочий IIS?Так что будет сложно сузить различия с пульта.

...