Вопрос по asp.net – ActiveDirectory Текущее имя пользователя в ASP.NET

7

Я пытаюсь заставить работать ActiveDirectory и стандартные формы входа в систему, но одна вещь останавливает меня. Я не могу получить имя текущего пользователя Windows. Самое близкое, что у меня есть,var i = WindowsIdentity.GetCurrent();, но это дает мне имя пользователя пула приложений IIS. В IIS включены анонимная аутентификация, проверка подлинности с помощью форм и проверка подлинности Windows. Я могу загрузить пользователей из AD, поэтому я предполагаю, что мой web.config настроен правильно.

Edit: Это мой web.config (с использованием провайдера Facade):

<membership defaultProvider="HybridMembershipProvider">
      <providers>
        <clear />
        <add name="HybridMembershipProvider" type="MyApp.Data.HybridMembershipProvider" AspNetProviderName="AspNetSqlMembershipProvider" ActiveDirectoryProviderName="ADMembershipProvider" />
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MyAppConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
        <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADConnectionString" 
            attributeMapUsername="sAMAccountName" enableSearchMethods="true" attributeMapEmail="mail"/>
      </providers>
    </membership>

Изменить 2: Вот мои настройки безопасности IIS.

IIS Security setup

Ваш Ответ

5   ответов
4

вы можете получить имя пользователя, как вы хотели. Это будет работать, только если эти данные находятся в поставщике членства в формах / AD, и они не являются анонимными.

Кроме того, смешивание аутентификации на основе форм и Windows / AD возможно, но не рекомендуется. Видетьэт если тебе нужно это сделать.

РЕДАКТИРОВАТ: Я думаю, что я неправильно понял, что вы хотели, так что вот высокоуровневое описание того, что происходит с вышеупомянутым решением:

Если вы отключите анонимную аутентификацию и включите олицетворение Asp.Net, IIS будет выполнять вызов 401 при каждом посещении сайта.
Если все находятся в одном домене, веб-браузер отправит ваши учетные данные в IIS, IIS проверит их на соответствие Active Directory, а затем AD предоставит IIS удостоверение для работы.

Когда у вас включена олицетворение Asp.Net, IIS затем связывает эту идентификационную информацию с текущим потоком / запросом. Таким образом, после аутентификации вы можете просто получить имя пользователя из текущего идентификатора потока, а затем запросить Active Directory, например:

using System.Threading;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

......

PrincipalContext pc = null;
UserPrincipal principal = null;

try
{
    var username = Thread.CurrentPrincipal.Identity.Name;
    pc = new PrincipalContext(ContextType.Domain, "active.directory.domain.com");
    principal = UserPrincipal.FindByIdentity(pc, username);

    var firstName = principal.GivenName ?? string.Empty
    var lastName = principal.Surname ?? string.Empty
    return string.Format("Hello {0} {1}!", firstName, lastName);
}
catch ...
finally
{
    if (principal != null) principal.Dispose();
    if (pc != null) pc.Dispose();
}
Не могли бы вы объяснить, пожалуйста, первые два пункта? Что вы имеете в виду «если эти данные находятся в формах членства провайдера / AD». Они пользователь, и я могу запросить AD по имени пользователя. «В противном случае вам придется запросить AD, чтобы получить их имя.» - Я могу сделать это, если у меня есть их имя, но как мне сделать это, чтобы получить их имя? Echilon
Отредактированный ответ для вас, пожалуйста, прочитайте еще раз Alex Moore
У меня проблема в том, чтоThread.CurrentPrincipal.Identity.Name пусто, я не могу получить имя пользователя. Echilon
Попробуйте отключить анонимную аутентификацию, это позволяет людям заходить на сайт без аутентификации, поэтому у них нет идентификаторов, когда вы их просматриваете. Alex Moore
1

. которые я написал, где я использовал проверку подлинности Windows, я все еще могу использоватьUser.Identity.Name, чтобы получить имя пользователя AD. Обычно это включает DC и возвращает имя учетной записи SAM пользователя. Я не пытался реализовать оба одновременно, ноUser.Identity.Name наверняка работает отдельно

1

если вы используете проверку подлинности с помощью активного каталога:

Context.User.Identity.Name

// фрагмент кода

sub Page_Load(sender as object, e as EventArgs)
  lblName.Text = "Hello " + Context.User.Identity.Name & "."
  lblAuthType.Text = "You were authenticated using " &   Context.User.Identity.AuthenticationType & "."
end sub

Ref:
Аутентификация Active Directory из ASP .NET
Как пройти проверку подлинности в Active Directory с помощью проверки подлинности с помощью форм и Visual Basic .NET Создание защищенных приложений ASP.NET: аутентификация, авторизация и безопасная связь

Ref: Вы можете использовать проверку подлинности Windows с ASP.NET несколькими способами:

Windows аутентификация без подражания. Это значение по умолчанию. ASP.NET выполняет операции и обращается к ресурсам, используя идентификатор процесса вашего приложения, который по умолчанию является учетной записью сетевой службы в Windows Server 2003.

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

Проверка подлинности Windows с олицетворением с фиксированной идентификацией. При таком подходе вы олицетворяете фиксированную учетную запись Windows для доступа к ресурсам с использованием определенного удостоверения. В Windows Server 2003 вам следует избегать такого подхода к олицетворению; вместо этого используйте пользовательский пул приложений с индивидуальной идентификацией службы.

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

IIdentity WinId= HttpContext.Current.User.Identity;
WindowsIdentity wi = (WindowsIdentity)WinId;

Если что-то не так, проверьте свое приложение Олицетворения метод согласно документации MSDN Как: использовать аутентификацию Windows в ASP.NET 2.0

Ссылка на статью СкоттуRecipe: включение проверки подлинности Windows в веб-приложении ASP.NET для внутренней сети

NB: не применяется при использовании проверки подлинности с помощью форм. Я использовал это с ASP.NET MVC, и System.Web.HttpContext.Current.User будет объектом System.Web.Security.FormsIdentity. Donal Lafferty
0

который я использовал в своем приложении ASP.NET MVC не так давно, он помог мне, хотя я не знаю, поможет ли он вам, вы можете проверить хотя

    private static void CheckIfUserExists(string p)
    {
        try
        {
                var user = (from x in Data.EntityDB.UserInfoes where x.SAMAccountName == p select x).FirstOrDefault();
                DirectoryEntry entry = new DirectoryEntry(Properties.Settings.Default.LDAPPath); //this is the connection to your active directory
                DirectorySearcher search = new DirectorySearcher(entry);
                search.PropertiesToLoad.Add("*");
                search.Filter = "(&(sAMAccountName=" + p + ")(objectCategory=person))";
                SearchResult searchResult = search.FindOne();
            //If the user under the alias is not found, Add a new user. Else, update his current data
            if (user == null)
            {
                XXXXXXX.Models.UserInfo newUserEntry = new Models.UserInfo
                {
                    SAMAccountName = p,
                    First_Name = searchResult.Properties.Contains("givenName") ? searchResult.Properties["givenName"][0].ToString() : string.Empty,
                    Last_Name = searchResult.Properties.Contains("sn") ? searchResult.Properties["sn"][0].ToString() : string.Empty,
                    Title = searchResult.Properties.Contains("title") ? searchResult.Properties["title"][0].ToString() : string.Empty,
                    Office = searchResult.Properties.Contains("l") ? searchResult.Properties["l"][0].ToString() : string.Empty,
                    Country = searchResult.Properties.Contains("c") ? searchResult.Properties["c"][0].ToString() : string.Empty,
                    Telephone = searchResult.Properties.Contains("telephoneNumber") ? searchResult.Properties["telephoneNumber"][0].ToString() : string.Empty,
                    Mobile_Phone = searchResult.Properties.Contains("mobile") ? searchResult.Properties["mobile"][0].ToString() : string.Empty,
                    Email_Address = searchResult.Properties.Contains("mail") ? searchResult.Properties["mail"][0].ToString() : string.Empty,
                    Image_Path = string.Format(Properties.Settings.Default.UserPicturePath, p),
                    LastUpdate = DateTime.Now,
                };

Обновит

Обратите внимание, что в этом извлечении я также запрашивал другую базу данных, игнорируя все операторы Linq.DirectoryEntry, DirectorySearcher а такжеSearchResult Занятия должны помочь вам с тем, что вам нужно.

update 2 переменная p может быть заменена наHttpContext.Current.User.Identity Свойств

update 3 Вот текущий список имен LDAP (где вы видите searchResult.Properties.Contains ("")Здес который указывает на различные пользовательские атрибуты в активном каталоге

Проблема в том, чтоHttpContext.Current.User.Identity пусто, а IsAuthenticated - ложно, поэтому у меня нет имени пользователя, хотя я нахожусь в учетной записи AD. Echilon
Это странно. Вы установили тег <поставщики> в вашем web.config для вашего соединения LDAP? потому что, если да, и вы можете войти, HttpContext.Current.User.Identity не должен быть нулевым Eon
<members defaultProvider = "ADMembershipProvider"> <поставщики> <clear /> <add name = "ADMembershipProvider" type = "System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Версия = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a "connectionStringName =" ADConnectionString "connectionUsername =" SOMETHING "connectionPassword =" SOMETHING "attributeMapUsername =" sAMAccountName "enableSearchMethods =" true "attributeMapEmail =" mail "/> <> provider </ members&g Eon
Извините, если нечитаемый, должен был быть быстрый ответ, не думал, что я скопировал и вставил все:? проверьте ваш webconfig, если он сопоставлен хотя бы Eon
Я добавил фрагмент web.config. Echilon
-1

var i = Environment.CurrentUser;

и ты можешь использовать и мой класс:http: //pastebin.com/xnYfVsL

Я не думаю, что это сработает для веб-приложений, и я предполагаю, что это потому, что он упомянул формы auth Eonasdan

Похожие вопросы