Создавая интрасеть в ASP .net CORE mvc, мне нужно получить имя пользователя Windows текущего пользователя для входа в систему, мне не нужно автоматически входить в систему с помощью проверки подлинности Windows, у меня уже есть настраиваемый контроллер входа для этого, я нужен только его логин.
Он отлично работает на локальном компьютере, но я не могу получить имя пользователя на сервере IIS:
Местный :
Environment.UserName => VeronY
System.Security.Principal.WindowsIdentity.GetCurrent().Name => Domain\VeronY
Сервер IIS:
Environment.UserName => Intranet
System.Security.Principal.WindowsIdentity.GetCurrent().Name => APPPOOL\Intranet
С Windows Auhtentication он автоматически входит в меня, что мне не нужно. Должно быть 2 типа аутентификации: автоматическая с AD и ручная с управлением формой с помощью Identity Framework.





ASP .net, похоже, не разрешает 2 разных типа подключения, поэтому я разрешил основному сайту использовать проверку подлинности с помощью формы и создал небольшой API:
[Authorize]
[Route("api/[controller]")]
public class ValuesController : Controller
{
[HttpGet]
public ActionResult Get()
{
return Json(User.Identity.Name);
}
}
Настроить с проверкой подлинности Windows.
А вот LoginController на основном сайте:
String responseString = "";
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://myapiURL");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.GetAsync("api/values").Result;
if (response.IsSuccessStatusCode)
{
responseString = response.Content.ReadAsStringAsync().Result;
responseString = Regex.Unescape(responseString).Replace("\"","");//Because the response is something like \\"Domaine\\\\Username\"\
}
else
{
return View();//server cannot be found or Windows authentication fail => form Login
}
}
String username = "";
String domain = "";
if (responseString != "" && responseString.Contains("\\"))
{
domain = responseString.Split('\\')[0];
username = responseString.Split("\\")[1];
if (domain ! = "MYDOMAIN")
{
return View();//Not in the correct domain => form Login
}
}
else
{
return View();//Not the correct response => form Login
}
UserPrincipal user = UserPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain), username);
if (null != user)
{
CustomAutomaticLogin(user)//All seems ok, try to log the user with custom login with AD informations
}
else
{
return View()//Not in AD => form login
}
}
Получение имени пользователя Windows в ASP .NET Core
Сначала обновите свойства windowsAuthentication и anonymousAuthentication в файле launchSettings.json. Анонимный доступ к сайту по-прежнему возможен.
launchSettings.json
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:53321",
"sslPort": 44320
}
}
Затем вы можете получить имя пользователя Windows с контроллера, используя приведенный ниже код.
HomeController.cs
public IActionResult Index()
{
string userName = HttpContext.User.Identity.Name;
return View(userName);
}
Внедрение зависимости
Если вы хотите получить доступ к имени пользователя Windows в сценарии запуска или в репозиториях, вы можете ввести зависимость HttpContextAccessor, которая разрешит доступ к объекту User. Более подробную информацию можно найти здесь.
public virtual void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddControllers();
}
https://blog.bitscry.com/2020/05/05/getting-the-windows-user-name-in-asp-net-core/