Как получить текущего пользователя 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.

ServiceSecurityContext.Current?.PrimaryIdentity

Другие вопросы по тегам