Я пытаюсь получить зарегистрированного пользователя в Windows на клиентском компьютере.Я пытался использовать User.Identity.Name & WindowsIdentity.GetCurrent (). Name.Когда я запускаю приложение локально через Visual Studio, оно отлично работает.Между тем, когда я публикую этот код на нашем сервере IIS, когда я запускаю этот код, он возвращает «NT AUTHORITY \ NETWORK SERVICE».
Я подумал, что это будет более простой задачей, и начал проходить кучуразличных поисков Google без удачи (возможно, это просто, что я новичок в ядре .net и я делаю глупую ошибку где-то).В любом случае, на моем сервере включена авторизация Windows (см. Изображение ниже).
Проект представляет собой веб-приложение .net core 2.1, и я работаю в C #,Любая помощь с этим была бы отличной!
Примечание
Моя предыдущая тема (теперь удаленная) для этого вопроса была помечена как дублирующий вопрос ( Как получить текущийпользователь в ядре asp.net ) Я не понимаю, как это дубликат, когда в этом вопросе они говорят, что их HttpContext имеет значение null.У меня нет этой проблемы, я возвращаю пользователя, но это НЕ пользователь клиентского компьютера.В связи с этим мне пришлось воссоздать этот вопрос.Если есть повторяющийся ответ, пожалуйста, опубликуйте его в комментариях, дайте мне обзор, если он на самом деле совпадает, и если это так, то мы можем пометить его как дубликат.Спасибо.
Я также пытался использовать:
HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value
Это было предложено в ответном сообщении, но это просто дает мне нулевую ссылку.
Обновление # 1
Просто подумал, что я бы также добавил, что на моем сервере уже установлены следующие роли:
Обновление # 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...