.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 后尝试加载页面,这解决了我的问题!
下面是我更改的应用程序池设置的屏幕截图:
无论如何这解决了我的问题希望这对可能有同样问题的人有所帮助!
我正在尝试获取客户端计算机上 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.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 后尝试加载页面,这解决了我的问题!
下面是我更改的应用程序池设置的屏幕截图:
无论如何这解决了我的问题希望这对可能有同样问题的人有所帮助!