Способ проверки подлинности Active Directory, используя проверку подлинности в формах и Visual C#.NET

Переводы статьи Переводы статьи
Код статьи: 316748 - Vizualiza?i produsele pentru care se aplic? acest articol.
В данной статье относится к следующим Microsoft.NET Пространства имен библиотеки классов Framework:
  • System.Text
  • Пространство имен System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security
Развернуть все | Свернуть все

В этой статье

Аннотация

В этой статье показано, как с веб-приложения ASP.NET приложение может использовать проверку подлинности форм для разрешения пользователей для проверки подлинности для Active Directory с помощью протокола LDAP (LDAP). Пользователь прошел проверку подлинности и перенаправления, можно использовать Application_AuthenticateRequest метод хранения файла Global.asax GenericPrincipal объект- Свойство HttpContext.User свойство, распространяющееся на весь запрос.

Создание веб-приложения ASP.NET веб-приложения в Visual C#.NET

Выполните следующие действия, чтобы создать новую страницу ASP.NET приложения с именем FormsAuthAd в Visual C#.NET:
  1. Запустите Microsoft Visual Studio.NET.
  2. На Файл Выберите пункт Новый, а затем нажмите кнопку Проект.
  3. Нажмите кнопку Проекты Visual C# Из списка Типы проектов, а затем нажмите кнопку ASP.NET веб-приложения Из списка Шаблоны.
  4. В Расположение нажмите Заменить WebApplication1 с FormsAuthAd.
  5. Нажмите кнопку ОК.
  6. Щелкните правой кнопкой мыши Ссылки узел в обозревателе решений и выберите команду Добавить ссылку.
  7. На .NET на вкладке Добавить ссылку диалоговое окно, нажмите кнопку System.DirectoryServices.dll, нажмите кнопку Выберите, а затем нажмите кнопку ОК.

Написать код проверки подлинности

Выполните следующие действия, чтобы создать новый файл класса с именем LdapAuthentication.cs:
  1. В обозревателе решений щелкните правой кнопкой мыши узел проекта, выберите пункт Кому Добавить, а затем нажмите кнопку Добавление нового элемента.
  2. Нажмите кнопку Класс Из списка Шаблоны.
  3. Тип LdapAuthentication.cs В диалоговом окне Имя поле, а затем нажмите кнопку Открыть.
  4. Замените существующий код в файле LdapAuthentication.cs с помощью следующего кода.
    using System;
    using System.Text;
    using System.Collections;
    using System.DirectoryServices;
    
    namespace FormsAuth
    {	
      public class LdapAuthentication
      {
        private String _path;
        private String _filterAttribute;
    
        public LdapAuthentication(String path)
        {
          _path = path;
        }
    		
        public bool IsAuthenticated(String domain, String username, String pwd)
        {
          String domainAndUsername = domain + @"\" + username;
          DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
    			
          try
          {	//Bind to the native AdsObject to force authentication.			
             Object obj = entry.NativeObject;
    
    	DirectorySearcher search = new DirectorySearcher(entry);
    
    	search.Filter = "(SAMAccountName=" + username + ")";
    	search.PropertiesToLoad.Add("cn");
    	SearchResult result = search.FindOne();
    
    	if(null == result)
    	{
      	  return false;
    	}
    
    	//Update the new path to the user in the directory.
    	_path = result.Path;
    	_filterAttribute = (String)result.Properties["cn"][0];
          }
          catch (Exception ex)
          {
            throw new Exception("Error authenticating user. " + ex.Message);
          }
    
    	return true;
         }
    
         public String GetGroups()
         {
           DirectorySearcher search = new DirectorySearcher(_path);
           search.Filter = "(cn=" + _filterAttribute + ")";
           search.PropertiesToLoad.Add("memberOf");
           StringBuilder groupNames = new StringBuilder();
    
           try
           {
             SearchResult result = search.FindOne();
    
    	 int propertyCount = result.Properties["memberOf"].Count;
    
       	 String dn;
    	 int equalsIndex, commaIndex;
    				
    	 for(int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
    	 {
    	   dn = (String)result.Properties["memberOf"][propertyCounter];
    
        	   equalsIndex = dn.IndexOf("=", 1);
    	   commaIndex = dn.IndexOf(",", 1);
    	   if(-1 == equalsIndex)
    	   {
    	     return null;
         	   }
    
               groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
    	   groupNames.Append("|");
    
        	 }
           }
           catch(Exception ex)
           {
             throw new Exception("Error obtaining group names. " + ex.Message);
           }			
           return groupNames.ToString();
         }
       }
    }
    					
Код проверки подлинности принимает домен, имя пользователя пароль и путь в дереве Active Directory. В этом коде используется Поставщик каталог LDAP.

Код в Logon.aspx страницы вызывает LdapAuthentication.IsAuthenticated метод и передает в учетные данные, полученные от пользователь. Затем DirectoryEntry объект создается с помощью пути к дереву каталогов, пользователь имя и пароль. Имя пользователя должно быть в формате «домен\пользователь». В DirectoryEntry объект пытается принудительно AdsObject Привязка по получении NativeObject свойство. Если эта операция пройдет успешно, CN атрибут для пользователя получена путем создания DirectorySearcher объект и фильтрация по SAMAccountName. После проверки подлинности пользователя IsAuthenticated Возвращает метод ИСТИНА.

Чтобы получить список групп, к которым принадлежит пользователь Этот код вызывает LdapAuthentication.GetGroups метод. В LdapAuthentication.GetGroups Получает список безопасности и групп рассылки пользователь принадлежит к путем создания DirectorySearcher объект и фильтрации, в зависимости от Член групп атрибут. Этот метод возвращает список групп, который отделен по каналам (|).

Обратите внимание, что LdapAuthentication.GetGroups метод манипулирует и усекает строки. Это позволяет сократить длительность строки, которая хранится в файле cookie проверки подлинности. Если строка не усечение, формат каждой группы выглядит следующим образом.
CN=...,...,DC=domain,DC=com
				
Это может создать очень длинная строка. Если длина этой строки больше, чем длина файла cookie, обозреватели не может принять файл cookie проверки подлинности, и вы будете перенаправлены на страницу входа в систему. Тем не менее, Если в многодоменной среде, может потребоваться сохранить имя домена Группа с именем, так как группы в различных доменах могут иметь одно имя группы. Необходимо сохранять имя домена, чтобы отличать одну группу от другого.

Большинство обозревателей поддерживают файлы cookie до 4096 байт. Если эта строка может потенциально превышает длину файла «cookie» требуется хранить данные группы в ASP.Объект кэша NET или в База данных. Кроме того, может потребоваться шифрование информации о группах и сохранять эти сведения в скрытом поле формы.

Написание кода Global.asax

Код в файл Global.asax содержит Application_AuthenticateRequest обработчик событий. Этот обработчик событий извлекает проверки подлинности cookie-файл Context.Request.cookies Коллекция, расшифровывает файл cookie и извлекает список групп будут храниться в FormsAuthenticationTicket.UserData свойство. Группы отображаются в список разделенных запятыми канала созданные на странице Logon.aspx.

Код выполняет синтаксический анализ строки в Массив строк для создания GenericPrincipal объект. После GenericPrincipal создать объект, этот объект помещается в Свойство HttpContext.User свойство.
  1. В обозревателе решений щелкните правой кнопкой мыши Global.asax, а затем нажмите кнопку Просмотр кода.
  2. Добавьте следующий код в верхней части кода Файла Global.asax.cs:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. Заменить существующий обработчик для события Application_AuthenticateRequest с помощью следующего кода.
    void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
      String cookieName = FormsAuthentication.FormsCookieName;
      HttpCookie authCookie = Context.Request.Cookies[cookieName];
    
      if(null == authCookie)
      {//There is no authentication cookie.
        return;
      }	
    		
      FormsAuthenticationTicket authTicket = null;
    	
      try
      {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
      }
      catch(Exception ex)
      {
        //Write the exception to the Event Log.
        return;
      }
    	
      if(null == authTicket)
      {//Cookie failed to decrypt.
        return;		
      }		
    	
      //When the ticket was created, the UserData property was assigned a
      //pipe-delimited string of group names.
      String[] groups = authTicket.UserData.Split(new char[]{'|'});
    
      //Create an Identity.
      GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication");
    	
      //This principal flows throughout the request.
      GenericPrincipal principal = new GenericPrincipal(id, groups);
    
      Context.User = principal;
    	
    }
    					

Изменение файла Web.config

В этом разделе, Настройка <forms></forms>, <authentication></authentication>и <authorization></authorization> элементы в файле Web.config. Изменение параметров только Прошедшие проверку пользователи имеют доступ к запросов приложения и без проверки подлинности выполняется перенаправление на страницу Logon.aspx. Можно изменить эту конфигурацию для Разрешить только определенные пользователи и группы доступ к приложению.

Замените существующий код в файл Web.config следующий код.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>    
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="logon.aspx" name="adAuthCookie" timeout="10" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				
Обратите внимание <identity impersonate="true"></identity> элемент конфигурации. В этом случае ASP.NET для олицетворения учетной записи, настроенной как анонимная учетная запись из Интернета Информационные службы (IIS). Из-за этой конфигурации все запросы приложения запускаются в контексте безопасности учетной записи, настроенной. В пользователь предоставляет учетные данные для аутентификации с использованием службы каталогов Active Directory, но учетная запись, которая обращается к Active Directory является конфигурация учетной записи. Для получения дополнительных Информация, см. Ссылкираздел.

Настройте службы IIS для анонимной проверки подлинности

Чтобы настроить IIS для анонимной проверки подлинности, выполните следующие действия:
  1. В службах IIS разверните узел компьютера для сервера, разверните узел Веб-узлы, разверните узел Веб-узел по умолчанию, щелкните правой кнопкой мыши FormsAuthAd, а затем нажмите кнопку Свойства.
  2. Нажмите кнопку Вкладку Безопасность каталога, а затем нажмите кнопку Редактирование Из списка Анонимный доступ и проверка подлинности.
  3. Сделать анонимной учетной записи для приложения учетной записью, имеющей разрешение на Active Directory.
  4. Нажмите эту кнопку, снимите флажок Разрешить IIS для управления пароль.
  5. В разделе «Доступ с проверкой подлинности» снимите флажок «Встроенная проверка подлинности Windows».
  6. Нажмите кнопку ОК.
  7. Нажмите кнопку Применить
По умолчанию IUSR_computerNameучетная запись не имеет разрешений в Active Directory.

Создайте страницу Logon.aspx

Выполните следующие действия, чтобы создать новую страницу ASP.NET веб-форму с именем Logon.aspx.
  1. В обозревателе решений щелкните правой кнопкой мыши узел проекта, выберите пункт Кому Добавить, а затем нажмите кнопку Добавление веб-формы.
  2. Тип Logon.aspx В диалоговом окне Имя поле, а затем нажмите кнопку Открыть.
  3. В обозревателе решений щелкните правой кнопкой мыши Logon.aspx, а затем нажмите кнопку Конструктор представлений.
  4. Нажмите кнопку HTML на вкладке конструктор.
  5. Замените существующий код следующим кодом.
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="FormsAuth" %>
    <html>
      <body>	
        <form id="Login" method="post" runat="server">
          <asp:Label ID="Label1" Runat=server >Domain:</asp:Label>
          <asp:TextBox ID="txtDomain" Runat=server ></asp:TextBox><br>    
          <asp:Label ID="Label2" Runat=server >Username:</asp:Label>
          <asp:TextBox ID=txtUsername Runat=server ></asp:TextBox><br>
          <asp:Label ID="Label3" Runat=server >Password:</asp:Label>
          <asp:TextBox ID="txtPassword" Runat=server TextMode=Password></asp:TextBox><br>
          <asp:Button ID="btnLogin" Runat=server Text="Login" OnClick="Login_Click"></asp:Button><br>
          <asp:Label ID="errorLabel" Runat=server ForeColor=#ff3300></asp:Label><br>
          <asp:CheckBox ID=chkPersist Runat=server Text="Persist Cookie" />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Login_Click(Object sender, EventArgs e)
    {
      String adPath = "LDAP://corp.com"; //Fully-qualified Domain Name
      LdapAuthentication adAuth = new LdapAuthentication(adPath);
      try
      {
        if(true == adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text))
        {
          String groups = adAuth.GetGroups();
    
          //Create the ticket, and add the groups.
          bool isCookiePersistent = chkPersist.Checked;
          FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,  txtUsername.Text,
    	DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups);
    	
          //Encrypt the ticket.
          String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    		
          //Create a cookie, and then add the encrypted ticket to the cookie as data.
          HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
    
          if(true == isCookiePersistent)
    	authCookie.Expires = authTicket.Expiration;
    				
          //Add the cookie to the outgoing cookies collection.
          Response.Cookies.Add(authCookie);		
    
          //You can redirect now.
          Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false));
        }
        else
        {
          errorLabel.Text = "Authentication did not succeed. Check user name and password.";
        }
      }
      catch(Exception ex)
      {
        errorLabel.Text = "Error authenticating. " + ex.Message;
      }
    }
    </script>
  6. Изменить путь к странице Logon.aspx указывать свой Сервер каталогов LDAP.
Странице Logon.aspx представлена страница, которая собирает сведения от пользователя и вызов методов LdapAuthentication класс. После кода проверяет подлинность пользователя и получает список групп, код создает FormsAuthenticationTicket Объект, шифрует билет, добавляется зашифрованный билет файл «cookie», добавляет файл cookie, HttpResponse.Cookies коллекции, а затем перенаправляет запрос на URL-адрес, который был первоначально запрошенный.

Изменение страницы WebForm1.aspx

Страницы WebForm1.aspx — это страница, запрошенная изначально. Когда пользователь запрашивает страницу, запрос перенаправляется Logon.aspx. страницы. После проверки подлинности запроса, запрос перенаправляется на Страницы WebForm1.aspx.
  1. В обозревателе решений щелкните правой кнопкой мыши WebForm1.aspx, а затем нажмите кнопку Конструктор представлений.
  2. Нажмите кнопку HTML на вкладке конструктор.
  3. Замените существующий код следующим кодом.
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="System.Security.Principal" %>
    <html>
      <body>	
        <form id="Form1" method="post" runat="server">
          <asp:Label ID="lblName" Runat=server /><br>
          <asp:Label ID="lblAuthType" Runat=server />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Page_Load(Object sender, EventArgs e)
    {
      lblName.Text = "Hello " + Context.User.Identity.Name + ".";
      lblAuthType.Text = "You were authenticated using " +   Context.User.Identity.AuthenticationType + ".";
    }
    </script>
    					
  4. Сохраните все файлы, а затем скомпилировать проект.
  5. Запросите страницу WebForm1.aspx. Обратите внимание, что вы являетесь перенаправление Logon.aspx.
  6. Введите учетные данные входа в систему и нажмите кнопку Отправить. Когда вы будете перенаправлены на WebForm1.aspx, обратите внимание, что пользователь отображается имя и, LdapAuthentication Тип аутентификации для Context.User.AuthenticationType свойство.
Примечание Корпорация Майкрософт рекомендует использовать протокол SSL (Secure Sockets Layer) шифрование при использовании проверки подлинности форм. Это обусловлено тем, что пользователь определить на основе файла cookie проверки подлинности и шифрования SSL на это приложение предотвращает нарушения файл cookie проверки подлинности и любые попытки другие полезные сведения, передаваемые.

Ссылки

Для получения дополнительных сведений щелкните следующие номера статей базы знаний Майкрософт:
306590ASP.NET безопасности: Обзор
317012 Учетная запись процесса в ASP.NET
311495 Как реализовать ролевой безопасности с проверкой подлинности на основе форм в приложении ASP.NET с помощью Visual C#.NET
с номером 313091 Как создавать ключи с помощью Visual Basic.NET для использования проверки подлинности для форм
313116 Страницу loginUrl не направляются запросы проверки подлинности форм

Свойства

Код статьи: 316748 - Последний отзыв: 7 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Ключевые слова: 
kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:316748

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com