Как получить зарегистрированную учетную запись домена Windows из приложения ASP.NET?

У нас есть приложение ASP.NET, которое управляет собственной базой данных пользователей, ролей и разрешений, и недавно мы добавили поле в таблицу User для хранения учетной записи домена Windows.

Я хотел бы сделать так, чтобы пользователю не приходилось физически входить в наше приложение, а скорее он автоматически входил в систему на основе текущей учетной записи домена Windows DOMAIN \ username. Мы хотим аутентифицировать учетную запись домена Windows по нашей собственной таблице User.

Это несложно сделать в Windows Forms, возможно ли это сделать в веб-формах?

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

Пояснение: мы используем наш собственный объект "Принципал".

Уточнение. Не уверен, имеет ли это значение или нет, но мы используем IIS7.


person mattruma    schedule 10.09.2008    source источник
comment
Я пробовал все эти варианты ... проблема в том, что я использую настраиваемый объект-принципал. Я попытался включить интегрированную безопасность, и, хотя пользователю все еще предлагалось ввести логин и пароль, после входа в систему Environment.UserName вернулся к СЕТЕВОЙ СЛУЖБЕ.   -  person mattruma    schedule 11.09.2008
comment
Я все еще не могу этого сделать. Я попытался возиться с интеграцией IIS тоже безрезультатно, он продолжает возвращаться к учетной записи NETWORK SERVICE. Есть ли способ, чтобы пользователи автоматически входили в систему на основе их текущих учетных данных Windows NT?   -  person mattruma    schedule 20.09.2008
comment
Похоже, что тогда олицетворение отключено. Олицетворение указывает ASP.NET выполнить запрос от имени аутентифицированного пользователя. Без него ASP.NET выполнит запрос с использованием учетной записи службы ASP.NET по умолчанию (или СЕТЕВОЙ СЛУЖБЫ в Windows 2003/2008).   -  person Chris    schedule 10.07.2009
comment
Браузер клиента решает, входить в систему автоматически или нет. IE основывает его на зонах безопасности, и я думаю, что Firefox для этого нужно какое-то изменение og about: config.   -  person Mark Brackett    schedule 10.07.2009


Ответы (8)


Несколько лет назад я сделал в значительной степени именно то, что вы хотите. Я пытаюсь найти для него какой-то код, хотя он был на предыдущей работе, так что этот код дома.

Хотя я помню, что использовал эту статью в качестве отправной точки. Вы настраиваете поставщика LDAP, чтобы вы могли фактически выполнить проверку пользователя по сравнению с LDAP. Одна вещь, в которой нужно убедиться, если вы попробуете подход LDAP. В файле настроек, в котором вы настраиваете LDAP, убедитесь, что LDAP все заглавные, в противном случае он не будет разрешен.

person pete blair    schedule 10.09.2008

Интеграция такого рода происходит на уровне сервера, это IIS решает, что пользователь не вошел в систему; и именно IIS отправляет пользователю запрос аутентификации, на который браузер реагирует.

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

Однако ваш настраиваемый основной объект может создавать забавы и игры; аутентификация этого типа будет WindowsPrincipal и WindowsIdentity; к которому вы можете получить доступ через объект User (см. Как: использовать проверку подлинности Windows в ASP .NET 2.0)

Я предполагаю, что вам нужен пользовательский принципал из-за ваших пользовательских ролей? Я сомневаюсь, что вы сможете заставить этих двоих хорошо сыграть; вы можете создать собственный поставщик ролей, который просмотрит ваше хранилище данных или посмотрите, что вы можете посмотреть на ADAM, расширение к AD, которое предоставляет роли для каждой программы и поставляется с хорошими инструментами управления.

person blowdart    schedule 20.09.2008

using System.Security.Principal;
...
WindowsPrincipal wp = (WindowsPrincipal)HttpContext.Current.User;

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

person Biri    schedule 10.09.2008

Это может быть полезно:

WindowsIdentity myIdentity = WindowsIdentity.GetCurrent();

WindowsPrincipal myPrincipal = new WindowsPrincipal(myIdentity);

string name = myPrincipal.Identity.Name;
string authType = myPrincipal.Identity.AuthenticationType;
string isAuth = myPrincipal.Identity.IsAuthenticated.ToString();

string identName = myIdentity.Name;
string identType = myIdentity.AuthenticationType;
string identIsAuth = myIdentity.IsAuthenticated.ToString();
string iSAnon = myIdentity.IsAnonymous.ToString();
string isG = myIdentity.IsGuest.ToString();
string isSys = myIdentity.IsSystem.ToString();
string token = myIdentity.Token.ToString();

Отказ от ответственности: я получил это из технической статьи, но не могу найти ссылку.

person Eric Z Beard    schedule 10.09.2008
comment
Мы используем настраиваемый объект Principal и Identity. - person mattruma; 10.09.2008

Вы можете использовать System.Threading.Thread.CurrentPrincipal.

person Omer van Kloeten    schedule 10.09.2008
comment
Мы используем настраиваемый объект Principal и Identity. - person mattruma; 10.09.2008
comment
Почему тогда это тебе не помогает? CurrentPrincipal вернет настраиваемый объект-участник ... - person Omer van Kloeten; 10.09.2008
comment
Мой пользовательский участник не содержит информации об учетной записи Windows. - person mattruma; 19.09.2008

Request.ServerVariables ["REMOTE_USER"]

Это не проверено для вашей установки, но я помню, как использовал это некоторое время назад.

person John Sheehan    schedule 11.09.2008

Попробуйте Request.ServerVariables ("LOGON_USER").

Если параметры безопасности каталога настроены так, что этот каталог не допускает анонимных пользователей, когда пользователь переходит на эту страницу, ему будет предложено стандартное модальное диалоговое окно с запросом имени пользователя и пароля. Request.ServerVariables ("LOGON_USER") вернет этого пользователя.

Однако это, вероятно, не сработает для вас, потому что вы используете свои собственные объекты безопасности. Если вы сможете выяснить, как обойти это окно входа в систему или передать учетные данные NT на сайт до того, как он их запросит, тогда все будет готово.

person CodingBytes    schedule 09.07.2009
comment
Правильно ... проблема в том, что я хочу использовать мой собственный основной объект. - person mattruma; 10.07.2009

Вы думали о выдаче себя за другое лицо? Вы можете сохранить учетные данные пользователя для входа в систему NT в своем настраиваемом объекте безопасности, а затем, при необходимости, просто олицетворять пользователя с помощью кода.

http://msdn.microsoft.com/en-us/library/aa292118(VS.71).aspx

person CodingBytes    schedule 10.07.2009