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

Переводы статьи Переводы статьи
Код статьи: 326340 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В данной статье описывается как страницы ASP.NET приложение может использовать проверку подлинности форм для разрешения пользователей для проверки подлинности для Active Directory с помощью протокола LDAP (LDAP).

Пользователь прошел проверку подлинности и перенаправления, можно использовать очередь Application_AuthenticateRequest метод хранения файла Global.asax GenericPrincipal объект- Свойство HttpContext.User свойство, распространяющееся на весь запрос.

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

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

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

Выполните следующие действия, чтобы создать новый файл класса с именем LdapAuthentication.vb:
  1. В обозревателе решений щелкните правой кнопкой мыши узел проекта, выберите пункт Кому Добавить, а затем нажмите кнопку Добавление нового элемента.
  2. Нажмите кнопку Класс Из списка Шаблоны.
  3. Тип LdapAuthentication.vb В диалоговом окне Имя поле, а затем нажмите кнопку Открыть.
  4. Замените существующий код в файле LdapAuthentication.vb с помощью следующего кода:
    Imports System
    Imports System.Text
    Imports System.Collections
    Imports System.DirectoryServices
    
    Namespace FormsAuth
        Public Class LdapAuthentication
    
            Dim _path As String
            Dim _filterAttribute As String
    
            Public Sub New(ByVal path As String)
                _path = path
            End Sub
    
            Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean
    
                Dim domainAndUsername As String = domain & "\" & username
                Dim entry As DirectoryEntry = New DirectoryEntry(_path, domainAndUsername, pwd)
    
                Try
                    'Bind to the native AdsObject to force authentication.			
                    Dim obj As Object = entry.NativeObject
                    Dim search As DirectorySearcher = New DirectorySearcher(entry)
    
                    search.Filter = "(SAMAccountName=" & username & ")"
                    search.PropertiesToLoad.Add("cn")
                    Dim result As SearchResult = search.FindOne()
    
                    If (result Is Nothing) Then
                        Return False
                    End If
    
                    'Update the new path to the user in the directory.
                    _path = result.Path
                    _filterAttribute = CType(result.Properties("cn")(0), String)
    
                Catch ex As Exception
                    Throw New Exception("Error authenticating user. " & ex.Message)
                End Try
    
                Return True
            End Function
    
            Public Function GetGroups() As String
                Dim search As DirectorySearcher = New DirectorySearcher(_path)
                search.Filter = "(cn=" & _filterAttribute & ")"
                search.PropertiesToLoad.Add("memberOf")
                Dim groupNames As StringBuilder = New StringBuilder()
    
                Try
                    Dim result As SearchResult = search.FindOne()
                    Dim propertyCount As Integer = result.Properties("memberOf").Count
    
                    Dim dn As String
                    Dim equalsIndex, commaIndex
    
                    Dim propertyCounter As Integer
    
                    For propertyCounter = 0 To propertyCount - 1
                        dn = CType(result.Properties("memberOf")(propertyCounter), String)
    
                        equalsIndex = dn.IndexOf("=", 1)
                        commaIndex = dn.IndexOf(",", 1)
                        If (equalsIndex = -1) Then
                            Return Nothing
                        End If
    
                        groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1))
                        groupNames.Append("|")
                    Next
    
                Catch ex As Exception
                    Throw New Exception("Error obtaining group names. " & ex.Message)
                End Try
    
                Return groupNames.ToString()
            End Function
        End Class
    End Namespace
    
    
    					

Описание кода

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

Примечание При использовании LDAP выполнить привязку к объекту Active Directory, связанные с TCP-порты используются. Увеличение использования LDAP с Пространство имен System.DirectoryServices пространство имен может использовать все доступные порты TCP. Вы можете для уменьшения нагрузки TCP с повторным использованием подключения, которое используется для Проверка подлинности пользователя.
Группы пользователей
Чтобы получить список групп, к которым принадлежит пользователь в этот код вызовы LdapAuthentication.GetGroups метод. В LdapAuthentication.GetGroups Получает список безопасности и групп рассылки пользователь принадлежит к путем создания DirectorySearcher объект и фильтрации, в зависимости от Член групп атрибут. Этот метод возвращает список групп, который отделен по каналам (|).

Обратите внимание, что LdapAuthentication.GetGroups метод манипулирует и усекает строки. Это позволяет сократить длительность строки, которая хранится в файле cookie проверки подлинности. Если строка не усечение, формат каждой группы выглядит следующим образом:
CN=...,...,DC=domain,DC=com
				
Это может создать очень длинная строка. Если длина этой строки больше, чем длина файла «cookie» может быть файл cookie проверки подлинности создан. Если эта строка потенциально может быть больше, чем длина файл «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.vb:
    Imports System.Web.Security
    Imports System.Security.Principal
    					
  3. Заменить существующий обработчик для события Application_AuthenticateRequest с помощью следующего кода:
    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
            ' Fires upon attempting to authenticate the use
            Dim cookieName As String = FormsAuthentication.FormsCookieName
            Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)
    
            If (authCookie Is Nothing) Then
                'There is no authentication cookie.
                Return
            End If
    
            Dim authTicket As FormsAuthenticationTicket = Nothing
    
            Try
                authTicket = FormsAuthentication.Decrypt(authCookie.Value)
            Catch ex As Exception
                'Write the exception to the Event Log.
                Return
            End Try
    
            If (authTicket Is Nothing) Then
                'Cookie failed to decrypt.
                Return
            End If
    
            'When the ticket was created, the UserData property was assigned a
            'pipe-delimited string of group names.
            Dim groups As String() = authTicket.UserData.Split(New Char() {"|"})
    
            'Create an Identity.
            Dim id As GenericIdentity = New GenericIdentity(authTicket.Name, "LdapAuthentication")
    
            'This principal flows throughout the request.
            Dim principal As GenericPrincipal = New GenericPrincipal(id, groups)
    
            Context.User = principal
    
        End Sub
    					

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

В этом разделе, Настройка Формы, Проверка подлинностии Авторизация элементы в файле 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="60" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				
Обратите внимание олицетворение удостоверения = «true» /элемент конфигурации. В этом случае ASP.NET для олицетворения учетной записи, т.е. настроен как анонимная учетная запись с Microsoft Internet Information Службы IIS. Из-за этой конфигурации все запросы приложения запускаются в контексте безопасности учетной записи, настроенной. Пользователь предоставляет учетные данные для аутентификации с использованием службы каталогов Active Directory, но учетная запись, которая обращается к Active Directory является конфигурация учетной записи. Для получения дополнительных Информация, см. ССЫЛКИраздел.

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

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

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

Выполните следующие действия, чтобы создать новую страницу ASP.NET веб-форму с именем Logon.aspx.
  1. В обозревателе решений щелкните правой кнопкой мыши узел проекта, выберите пункт Кому Добавить, а затем нажмите кнопку Добавление веб-формы.
  2. Тип Logon.aspx В диалоговом окне Имя поле, а затем нажмите кнопку Открыть.
  3. В обозревателе решений щелкните правой кнопкой мыши Logon.aspx, а затем нажмите кнопку Конструктор представлений.
  4. Нажмите кнопку HTML на вкладке конструктор.
  5. Замените существующий код следующим кодом:
    <%@ Page language="vb" AutoEventWireup="true" %>
    <%@ Import Namespace="FormsAuthAd.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">
    sub Login_Click(sender as object,e as EventArgs)
      Dim adPath as String = "LDAP://DC=..,DC=.." 'Path to your LDAP directory server
      Dim adAuth as LdapAuthentication = new LdapAuthentication(adPath)
      try
        if(true = adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text)) then
          Dim groups as string = adAuth.GetGroups()
    
          'Create the ticket, and add the groups.
          Dim isCookiePersistent as boolean = chkPersist.Checked
          Dim authTicket as FormsAuthenticationTicket = new FormsAuthenticationTicket(1, _
               txtUsername.Text,DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups)
    	
          'Encrypt the ticket.
          Dim encryptedTicket as String = FormsAuthentication.Encrypt(authTicket)
    		
          'Create a cookie, and then add the encrypted ticket to the cookie as data.
          Dim authCookie as HttpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
    
          if(isCookiePersistent = true) then
    		authCookie.Expires = authTicket.Expiration
          end if				
          '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."
        end if
     
      catch ex as Exception
        errorLabel.Text = "Error authenticating. " & ex.Message
      end try
    end sub
    </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="vb" 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">
    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
    </script>
    					
  4. Сохраните все файлы, а затем скомпилировать проект.
  5. Запросите страницу WebForm1.aspx. Обратите внимание, что вы являетесь перенаправление Logon.aspx.
  6. Введите учетные данные входа в систему и нажмите кнопку Отправить. Когда вы будете перенаправлены на WebForm1.aspx, обратите внимание, что пользователь отображается имя и, LdapAuthentication Тип аутентификации для Context.User.Identity.AuthenticationType свойство.
Примечание Корпорация Майкрософт рекомендует использовать протокол SSL (Secure Sockets Layer) шифрование при использовании проверки подлинности форм. Это обусловлено тем, что пользователь определить на основе файла cookie проверки подлинности и шифрования SSL на это приложение предотвращает нарушения файл cookie проверки подлинности и любые попытки другие полезные сведения, передаваемые.

Ссылки

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

Свойства

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

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

 

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