Как получить текущего пользователя Windows с ASP.NET Core RC2 MVC6 и IIS7
У меня есть сайт интрасети, построенный в MVC6 с использованием ASP.NET Core RC2. Я хочу получить имя пользователя Windows для пользователя, обращающегося к сайту в интрасети.
Поэтому, если Джим заходит на сайт интрасети, я хочу, чтобы сайт получал "Домен \ Джим", а если Энн заходит на сайт интрасети, я хочу, чтобы сайт получал "Домен \ Анна".
На моем сервере IIS включена только проверка подлинности Windows, анонимная проверка подлинности отключена.
Мой сайт настроен на использование проверки подлинности Windows и отключение анонимной проверки подлинности.
<system.web>
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>
</system.web>
Через Debug я могу использовать System.Security.Principal.WindowsIdentity.GetCurrent().Name
, но это, конечно, возвращает "IIS APPPOOL\SiteName" на сервере IIS.
Я нашел много примеров из более старой версии ASP.NET с использованием HttpContext, и я попытался внедрить это в мой контроллер с помощью следующего, но userName заканчивается null.
//Startup.cs
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//HomeController.cs
public HomeController(IHttpContextAccessor _accessor)
{
string userName = _accessor.HttpContext.User.Identity.Name;
}
Как правильно передать имя пользователя Windows на сайт интрасети в ASP.NET Core RC2 MVC6?
3 ответа
Может помочь кому-то, кто все еще ищет. В соответствии с документацией MS https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2 добавьте HttpContextAccessor в методе ConfigureServices (startup.cs). Передайте этот httpcontextaccessor в контроллер и доступ вошедшего в систему пользователя.
Я последовал этому примеру и смог получить зарегистрированного пользователя Windows Authenticated даже после развертывания основного веб-сайта в IIS.
Вот фрагменты кода
В Startup.cs (под методом ConfigureServices) добавьте строку
services.AddHttpContextAccessor();
Затем в вашем файле контроллера добавьте следующий фрагмент необходимых строк кода. Код ниже является примером.
public YourController : Controller
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly string _user;
public YourController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
_user = _httpContextAccessor.HttpContext.User.Identity.Name;
}
}
Для любого, кто использует проверку подлинности Windows в приложении для интрасети и хочет просто получить информацию о пользователе, это проще, чем вы думаете.
В вашем контроллере эта строка будет захватывать имя текущего пользователя в форме DOMAIN\username.
var userId = this.User.Identity.Name;
Я потратил некоторое время на просмотр других ответов, прежде чем понял, что большинство из них предполагали, что я внедряю индивидуальные учетные записи для аутентификации в AD, а не в стандартной аутентификации Windows.
С помощью var userId = this.User.Identity.Name;
работал на меня. Мое приложение работает в интрасети, и все, что я хотел сделать, это получить идентификатор входа пользователя из Windows. Мне не нужно было хранить информацию о пользователе, так как она уже хранится в Active Directory.