У нас есть приложение ASP.NET, которое управляет собственной базой данных пользователей, ролей и разрешений, и недавно мы добавили поле в таблицу User для хранения учетной записи домена Windows.
Я хотел бы сделать так, чтобы пользователю не приходилось выполнять вход физически в наше приложение, а скорее он автоматически входил в систему на основе текущей учетной записи домена Windows DOMAIN \ username. Мы хотим аутентифицировать учетную запись домена Windows по нашей собственной таблице User.
Это несложно сделать в Windows Forms, возможно ли это сделать в веб-формах?
Я не хочу, чтобы пользователю предлагался экран вызова Windows, я хочу, чтобы наша система обрабатывала вход в систему.
Разъяснение: Мы используем наш собственный объект "Принципал".
Разъяснение: Не уверен, имеет ли это значение или нет, но мы используем IIS7.
Похоже, что тогда олицетворение отключено. Олицетворение указывает ASP.NET выполнить запрос от имени аутентифицированного пользователя. Без него ASP.NET выполнит запрос с использованием учетной записи службы ASP.NET по умолчанию (или СЕТЕВОЙ СЛУЖБЫ в Windows 2003/2008).
Я все еще не могу этого сделать. Я попытался возиться с интеграцией IIS, но безрезультатно, он продолжает возвращаться к учетной записи NETWORK SERVICE. Есть ли способ, чтобы пользователи входили в систему автоматически на основе их текущих учетных данных Windows NT?
Браузер клиента решает, входить в систему автоматически или нет. IE основывает его на зонах безопасности, и я думаю, что Firefox нужно какое-то изменение og about: config для этого.





using System.Security.Principal;
...
WindowsPrincipal wp = (WindowsPrincipal)HttpContext.Current.User;
чтобы получить текущего пользователя домена. Конечно, вы должны убедиться, что IIS настроен для обработки аутентификации Windows.
Это может быть полезно:
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();
Отказ от ответственности: я получил это из технической статьи, но не могу найти ссылку.
Мы используем настраиваемый объект Principal и Identity.
Несколько лет назад я сделал в значительной степени именно то, что вы хотите. Я пытаюсь найти для него какой-то код, хотя он был на предыдущей работе, так что этот код дома.
Я помню, что использовал Эта статья в качестве отправной точки. Вы настраиваете поставщика LDAP, чтобы вы могли фактически выполнить проверку пользователя по сравнению с LDAP. Одна вещь, в которой нужно убедиться, если вы попробуете подход LDAP. В файле настроек, в котором вы настраиваете LDAP, убедитесь, что LDAP - это все заглавные буквы, в противном случае он не будет разрешен.
Можно использовать System.Threading.Thread.CurrentPrincipal.
Мы используем настраиваемый объект Principal и Identity.
Почему тогда это тебе не помогает? CurrentPrincipal вернет настраиваемый объект-участник ...
Мой пользовательский участник не содержит информации об учетной записи Windows.
Request.ServerVariables ["REMOTE_USER"]
Это не проверено для вашей установки, но я помню, как использовал это некоторое время назад.
Интеграция такого рода происходит на уровне сервера, это IIS решает, что пользователь не вошел в систему; и именно IIS отправляет пользователю запрос аутентификации, на который браузер реагирует.
Поскольку вы хотите использовать вход в домен, есть только один способ сделать это; встроенная проверка подлинности Windows. Это будет работать только в том случае, если сервер IIS также является частью домена, и пользователи обращаются к машине напрямую, а не через прокси, а с машин, которые также являются частью домена (с надлежащим образом авторизованными пользователями).
Однако ваш настраиваемый основной объект может создавать развлечения и игры; аутентификация этого типа будет WindowsPrincipal и WindowsIdentity; к которому вы можете получить доступ через объект User (см. Как: использовать проверку подлинности Windows в ASP.NET 2.0)
Я предполагаю, что вам нужен пользовательский принципал из-за ваших пользовательских ролей? Я сомневаюсь, что вы сможете заставить этих двоих хорошо сыграть; вы можете создать собственный поставщик ролей, который просматривает ваше хранилище данных, или вы можете посмотреть на АДАМ, расширение AD, которое предоставляет роли для каждой программы и поставляется с хорошими инструментами управления.
Попробуйте Request.ServerVariables ("LOGON_USER").
Если параметры безопасности каталога настроены так, что этот каталог не допускает анонимных пользователей, когда пользователь переходит на эту страницу, ему будет предложено стандартное модальное диалоговое окно с запросом имени пользователя и пароля. Request.ServerVariables ("LOGON_USER") вернет этого пользователя.
Однако это, вероятно, не сработает для вас, потому что вы используете свои собственные объекты безопасности. Если вы сможете выяснить, как обойти это окно входа в систему или передать учетные данные NT на сайт до того, как он их запросит, тогда все будет готово.
Правильно ... проблема в том, что я хочу использовать мой собственный основной объект.
Вы думали о выдаче себя за другое лицо? Вы можете сохранить учетные данные пользователя для входа в систему NT в своем настраиваемом объекте безопасности, а затем просто выдавать себя за пользователя с помощью кода, когда это необходимо.
http://msdn.microsoft.com/en-us/library/aa292118(VS.71).aspx
Я пробовал все эти варианты ... проблема в том, что я использую настраиваемый объект-принципал. Я попытался включить интегрированную безопасность, и, хотя пользователю все еще предлагалось ввести логин и пароль, после входа в систему Environment.UserName вернулся к СЕТЕВОЙ СЛУЖБЕ.