Лучший способ получить имя пользователя Windows с использованием проверки подлинности с помощью форм?

89
10

Я унаследовал проект, который использует проверку подлинности форм, но для последнего запроса функции требуется, чтобы я получил имя пользователя Windows для некоторых пользователей.


Это веб-сайт, который использует проверку подлинности с помощью форм (и я не хочу это менять, на данном этапе это будет слишком много работы), но у меня был запрос функции, позволяющий нашим внутренним пользователям легко входить в систему (обычно без ввести свой пароль или имя пользователя).


Мой текущий метод HORRIBLE, он включает проверку ip-адреса, чтобы узнать, подключены ли они к одному из наших IP-адресов, если они есть, перенаправляя их в отдельный проект, который использует проверку подлинности Windows, которая затем перенаправляет их обратно к оригиналу страницы с строкой запроса, содержащей их имя пользователя (если я вынужден остаться с этим методом, мне, вероятно, потребуется зашифровать это, хотя оно все еще не настолько безопасно, как хотелось бы).


Я могу легко выполнить проверку подлинности Windows внутри своего приложения, однако жесткая часть получает имя пользователя Windows. Я не мог понять, как это сделать, отсюда мой довольно уродливый метод.


Любая помощь была бы высоко оценена.


EDIT: мое вторичное приложение просто делает это:


string username = HttpContext.Current.User.Identity.Name;
string retpath = Request.QueryString["retpath"];
Response.Redirect("http://" + retpath + "?id=" + username);

спросил(а) 2021-01-26T00:33:37+03:00 5 месяцев назад
1
Решение
77

В этой статье содержится ответ (спасибо vinodpthmn): http://msdn.microsoft.com/en-us/library/ms972958.aspx
Я нашел ссылки на эту статью в своих исследованиях, но никто из них не работает! Рад, что я наконец смог его прочитать и решить мою проблему.


Как я уже говорил, мне нужно было только получить имя пользователя из Windows, но это оказалось довольно хлопотным, к счастью, фактическое решение было относительно простым.


Во-первых, вам нужно создать дополнительную страницу входа (я назвал my winlogin.aspx) и установить ее как страницу входа по умолчанию в ваш файл Web.Config, например:


<authentication mode="Forms">
<forms name="something" defaultUrl="default.aspx" loginUrl="winlogin.aspx" protection="All" slidingExpiration="true" timeout="90"/>
</authentication>

Внутри файла winlogin.aspx.cs вы проверяете пользователей Windows и используете


FormsAuthentication.RedirectFromLoginPage(username, false/true);

Чтобы перенаправить их туда, куда они направлялись. Фактическая страница winlogin.aspx должна быть пустой, пользователи ее никогда не видят.

Вам нужно опубликовать на своем тестовом веб-сервере следующую часть:
Вы получаете доступ к свойствам файла winlogin.aspx в диспетчере IIS и устанавливаете для WindowsAuthentication значение true и Anonymous Authentication равным false. Вам также необходимо создать настраиваемый указатель страницы с ошибкой 401 (мои указывает на мою старую страницу Login.aspx).


Пользователи, которые могут войти в систему с помощью проверки подлинности Windows, сделают это, все остальные будут перенаправлены на старую страницу входа.


Voila!


Однако есть несколько проблем, вы теряете URL-адрес возврата (вы не можете использовать "=" в ссылке на пользовательскую страницу ошибки 401, поэтому ничто не может быть проанализировано), поэтому вы, вероятно, захотите установить cookie, когда люди перенаправляются на страницу winlogin и получают доступ к этому файлу cookie на странице входа в форму, чтобы перенаправить пользователя соответствующим образом.


Если у кого-нибудь есть какие-либо вопросы, я предлагаю прочитать статью, указанную выше, или не стесняйтесь задавать вопросы здесь.


Спасибо всем за вашу помощь!

ответил(а) 2021-01-26T00:33:37+03:00 5 месяцев назад
-4

Вы можете использовать службы каталогов


PrincipalContext pc = null;
UserPrincipal principal = null;
var username = User.Identity.Name;
pc = new PrincipalContext(ContextType.Domain, "give your domain name here");
principal = UserPrincipal.FindByIdentity(pc, userName);
var firstName = principal.GivenName ?? string.Empty;
var lastName = principal.Surname ?? string.Empty;

добавьте ссылку для System.DirectoryServices.AccountManagement

ответил(а) 2021-01-26T00:33:37+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема