В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

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

ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.

Эта статья на английском языке: 316748
В данной статье относится к следующие пространства имен библиотеки классов платформа.NET Framework корпорации Майкрософт:
  • System.Text
  • Пространство имен System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security
Аннотация
В данном пошаговом руководстве показано, как приложение ASP.NET может использовать проверку подлинности форм для разрешения пользователей для проверки подлинности в Active Directory с помощью LDAP Lightweight Directory Access Protocol (). После проверки подлинности и перенаправления пользователя можно использовать метод 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. В обозревателе решений щелкните правой кнопкой мыши узел проекта pointto Добавитьи выберите команду Добавить новый элемент.
  2. В области Шаблонывыберите шаблон класс .
  3. Тип LdapAuthentication.cs в поле имя , а затем щелкните Открыть.
  4. Замените существующий код в filewith 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 с путь в дереве каталогов, имя пользователя и пароль. Имя пользователя должно быть в формате «домен\пользователь». Затем пытается принудительно AdsObject привязки, получая свойство NativeObject объекта DirectoryEntry . Если эта операция пройдет успешно, атрибута CN для пользователя получается путем создания объекта DirectorySearcher и фильтрация SAMAccountName. После проверки подлинности пользователя, метод IsAuthenticated возвращает значение true.

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

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

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

Напишите код Global.asax

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

Код выполняет синтаксический анализ строки в массив строк, создание объектов GenericPrincipal . После создания объектов GenericPrincipal объект помещается в свойство HttpContext.User .
  1. В обозревателе решений щелкните правой кнопкой мыши Global.asaxи выберите команду Просмотреть код.
  2. Добавьте следующий код в верхней части файла кода behindGlobal.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 для олицетворения учетной записи, настроенной как учетная запись анонимного из Microsoft IIS (IIS). При такой конфигурации все запросы к данному приложению выполняться в контексте безопасности учетной записи, настроенной. Пользователь предоставляет учетные данные для проверки подлинности Active Directory, но учетной записи, которая обращается к Active Directory является конфигурация учетной записи. Дополнительные сведения см. Ссылки раздел.

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

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

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

Выполните следующие действия для создания новой веб-формы ASP.NET под названием Logon.aspx.
  1. В обозревателе решений щелкните правой кнопкой мыши узел проекта pointto Добавитьи нажмите кнопку Добавить веб-форму.
  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 указывать сервер каталога yourLDAP.
На странице 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. Обратите внимание, что areredirected для Logon.aspx.
  6. Введите учетные данные для входа и нажмите кнопку Отправить. Когда вы будете перенаправлены на WebForm1.aspx, обратите внимание, что отображается имя пользователя, и что LdapAuthentication проверки подлинности введите для свойства Context.User.AuthenticationType .
Примечание. Корпорация Майкрософт рекомендует использовать шифрования Secure Sockets Layer (SSL), при использовании проверки подлинности форм. Это происходит потому, что пользователь идентифицируется на основании файла cookie проверки подлинности и шифрования SSL на это приложение предотвращает нарушения файл cookie проверки подлинности и другие полезные сведения, передаваемые.
Ссылки
Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
306590 Общие сведения о безопасности ASP.NET
317012 Удостоверение процесса и запроса в ASP.NET
311495 Инструкции по реализации безопасности на основе ролей с помощью проверки подлинности на основе форм в приложении ASP.NET с помощью Visual C# .NET
313091 Создание ключей с помощью .NET Visual Basic для использования при проверке подлинности форм
313116 Не направляются запросы проверки подлинности форм на страницу loginUrl

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 316748 — последний просмотр: 05/07/2016 20:27:00 — редакция: 5.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
Отзывы и предложения