.Net Core 2.1 获取客户端机器 windows 用户名

.Net Core 2.1 getting client machines windows user name

我正在尝试获取客户端计算机上 Windows 中当前登录的用户。我试过使用 User.Identity.Name & WindowsIdentity.GetCurrent().Name。当我通过 Visual Studio 在本地 运行 应用程序时,它 运行 很棒。同时,当我 运行 将这段代码发布到我们的 IIS 服务器时,它 returns "NT AUTHORITY\NETWORK SERVICE".

我认为这将是一项更容易的任务,并开始进行一系列不同的 google 搜索但没有运气(也许它只是我对 .net 核心的新手并且我在某个地方犯了一个愚蠢的错误).无论如何,我的服务器启用了 Windows 授权(见下图)。

该项目是一个 .net core 2.1 web 应用程序,我在 C# 中工作。任何对此的帮助都会很棒!

备注

我之前关于这个问题的话题(现已删除)被标记为重复问题()我不明白这是怎么重复的,因为在这个问题中他们说他们的 HttpContext 是空的。我没有这个问题,我 return 一个用户,但它不是客户端机器的用户。因此,我不得不重新提出这个问题。如果有重复的答案,请在评论中 post 让我检查它是否确实相同,如果是,那么我们可以将其标记为重复。谢谢。

我也试过使用:

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

这是在重复答案 post 中提出的建议,但这只会给我一个空引用错误。

更新 #1

只是想我还要包括我的服务器已经安装了以下角色:

更新 #2

这是获取用户名的方法,最初加载的是 index.cshtml razor 页面。

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);

进入我的 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...

我刚刚从 Visual Studio 中的模板创建了一个新的 ASP.NET Core 2.1 MVC Web 应用程序项目。在模板向导中检查 "Windows Authentication" 和

已添加User.Identity.Name

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

            return View();
        }

在开发机器上开箱即用。 您 运行 只有在迁移到生产 IIS 时才会遇到问题? 因此很难缩小与远程的差异。

正在搜索解决方案我 运行 进入此站点:

Identities for different IIS7 Authentication Configurations

查看用于不同应用程序池设置的不同身份名称,我决定尝试更改它。让我明白这一点的是我在代码中取回的用户名 (NT AUTHORITY\NETWORK SERVICE) 与身份设置 NetworkService。因此,我尝试在将应用程序池标识更改为 LocalSystem 后尝试加载页面,这解决了我的问题!

下面是我更改的应用程序池设置的屏幕截图:

无论如何这解决了我的问题希望这对可能有同样问题的人有所帮助!