폼 인증 및 Visual Basic.NET을 사용 하 여 Active Directory에 대해 인증 하는 방법

요약

이 문서는 ASP.NET 응용 프로그램이 폼 인증을 사용 하 여 경량 디렉터리 액세스 프로토콜 (LDAP)를 사용 하 여 Active Directory에 대해 인증 하도록 허용 하는 방법을 설명 합니다.

사용자가 인증 되 고 리디렉션, 후 요청 으로부터 형성 되는 HttpContext.User 속성에 GenericPrincipal 개체를 저장 하 하십시오 방식의 Global.asax 파일을 사용할 수 있습니다.

Visual Basic.NET에서에서 ASP.NET 웹 응용 프로그램 만들기

Visual Basic.NET에서 FormsAuthAd 라는 새 ASP.NET 웹 응용 프로그램을 만들려면 다음과 같이 하십시오.
  1. Microsoft Visual Studio.NET을 시작 합니다.
  2. 파일 메뉴에서 새로 만들기를 가리키고 프로젝트를 클릭 합니다.
  3. 프로젝트 형식 Visual Basic 프로젝트 를 클릭 하 고 누른 다음 템플릿에서 ASP.NET 웹 응용 프로그램 입니다.
  4. 위치 상자에 http://<servername>/FormsAuthAd ( http://localhost (하기 위해 http://localhost/FormsAuthAd있고 확인을 클릭 합니다 로컬 서버를 사용 하는 경우 대체 입력.
  5. 솔루션 탐색기에서 참조 노드를 마우스 오른쪽 단추로 클릭 한 다음 참조 추가클릭 합니다.
  6. 참조 추가 대화 상자의 .NET 탭에서 System.DirectoryServices.dll을 누르고 선택을 클릭 한 다음 확인을 누릅니다.

인증 코드 작성

LdapAuthentication.vb 라는 새 클래스 파일을 만들려면 다음과 같이 하십시오.
  1. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로 클릭 하 고 추가를 가리킨 다음 새 항목 추가클릭 합니다.
  2. 템플릿아래에서 클래스 를 클릭 합니다.
  3. 이름 상자에 LdapAuthentication.vb 를 입력 한 다음 열기를 클릭 합니다.
  4. LdapAuthentication.vb 파일에서 기존 코드를 다음 코드로 바꿉니다.
    Imports SystemImports 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 개체를 NativeObject 속성을 가져와서 AdsObject 바인딩 하려고 합니다. 이 작업이 성공 하면 DirectorySearcher 개체를 만들어 및 SAMAccountName을 필터링 하 여 사용자에 대 한 CN 특성을 얻습니다. 사용자가 인증 된 후 IsAuthenticated 메서드는 true를 반환 합니다.

참고: LDAP를 사용 하 여 Active Directory와 관련 된 개체를 바인딩할 TCP 포트 사용 중인. 대해서 네임 스페이스를 사용 하 여 ldap 사용 사용할 수 있는 모든 TCP 포트를 사용할 수 있습니다. 사용자를 인증 하는 데 사용 하는 연결을 다시 사용 하 여 TCP 로드를 줄일 수 있습니다.
사용자 그룹
사용자가 속한 그룹의 목록을 얻으려면,이 코드는 LdapAuthentication.GetGroups 메서드를 호출 합니다. LdapAuthentication.GetGroups 메서드는 DirectorySearcher 개체를 만들어 한 memberOf 특성에 따라 필터링 하 여 사용자가 속한 보안 그룹과 메일 그룹의 목록을 가져옵니다. 이 메서드는 파이프 기호 (|)로 구분 된 그룹 목록을 반환 합니다.

LdapAuthentication.GetGroups 메서드를 조작 문자열이 잘립니다 유의 하십시오. 인증 쿠키에 저장 되어 있는 문자열의 길이 줄입니다. 문자열이 잘리지 각 그룹의 형식은 다음과 같이 나타납니다.
CN=...,...,DC=domain,DC=com
이 매우 긴 문자열이 생깁니다. 이 문자열의 길이가 쿠키의 길이 보다 큰 경우 인증 쿠키를 만들 수 있습니다. 이 문자열이 쿠키의 길이 보다 큰 수를 하는 경우 ASP.NET 캐시 개체 또는 데이터베이스 그룹 정보를 저장 하는 것이 좋습니다. 또는 그룹 정보를 암호화 하 고 숨겨진된 폼 필드에이 정보를 저장할 수도 있습니다.

Global.asax 코드 작성

Global.asax 파일의 코드 하십시오 이벤트 처리기를 제공합니다. 이 이벤트 처리기 Context.Request.Cookies 컬렉션에서 인증 쿠키를 검색 하 고 해당 쿠키의 암호를 해독 FormsAuthenticationTicket.UserData 속성에 저장 될 그룹 목록을 검색 합니다. 그룹은 Logon.aspx 페이지에 만들어지는 파이프 구분 된 목록에 표시 됩니다.

코드는 GenericPrincipal 개체를 만드는 데 문자열 배열에서 문자열을 구문 분석 합니다. GenericPrincipal 개체를 만든 후이 개체는 HttpContext.User 속성에 배치 됩니다.
  1. 솔루션 탐색기에서 Global.asax마우스 오른쪽 단추로 클릭 하 고 코드 보기를클릭 합니다.
  2. Global.asax.vb 파일 뒤에 코드를 맨 앞에 다음 코드를 추가 합니다.
    Imports System.Web.SecurityImports System.Security.Principal

  3. 하십시오 에 대 한 기존의 빈 이벤트 처리기를 다음 코드로 바꿉니다.
    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>

공지는 identity 가장 = "true" / 구성 요소입니다. 그러면 ASP.NET은 Microsoft 인터넷 정보 서비스 (IIS)에서 익명 계정으로 구성 된 계정을 가장 하도록 합니다. 이 구성의 결과로이 응용 프로그램에 대 한 모든 요청은 구성 된 계정의 보안 컨텍스트에서 실행합니다. 사용자가 Active Directory에 대 한 인증 자격 증명 제공 하지만 Active Directory에 액세스 하는 계정은 구성 된 계정입니다. 자세한 내용은 " 참조 " 절을 참조.

익명 인증을 위해 IIS를 구성 합니다.

IIS 익명 인증을 구성 하려면 다음과이 같이 하십시오.
  1. 인터넷 정보 서비스 (IIS) 관리 콘솔에서 "FormsAuthAd"에 대 한 가상 디렉터리 노드를 마우스 오른쪽 단추로.
  2. 속성클릭 한 다음 디렉터리 보안 탭을 클릭 합니다.
  3. 익명 액세스 및 인증 제어에서 편집 을 클릭 합니다.
  4. 익명 액세스 확인란을 선택 합니다.
  5. 응용 프로그램에 대 한 익명 계정이 Active Directory에 있는 권한이 있는 계정을 확인 합니다.
  6. 제어 암호 IIS 허용 확인란의 선택을 취소 하려면 클릭 하십시오.
기본 IUSR_컴퓨터 이름 계정에는 Active Directory에 있는 권한이 없습니다.

Logon.aspx 페이지 만들기

Logon.aspx 라는 새 ASP.NET Web Form을 만들려면 다음과 같이 하십시오.
  1. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로 클릭 하 고 추가를 가리킨 다음 Web Form 추가클릭 합니다.
  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 개체를 만듭니다.
  • 티켓을 암호화합니다.
  • 암호화 된 티켓을 쿠키에 추가
  • 쿠키 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 속성에 입력 합니다.
참고: 폼 인증을 사용 하는 경우 Secure Sockets Layer (SSL) 암호화를 사용 하는 것이 좋습니다. 즉, 사용자가 인증 쿠키를 기반으로 식별 하 고이 응용 프로그램에 SSL 암호화 누구나 인증 쿠키와 전송 되는 기타 유용한 정보를 손상 시 키 지 않습니다.

참조

자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료에 있는 문서를 참조하십시오.
306590 ASP.NET 보안 개요

ASP.NET에서 317012 프로세스 및 요청 id

306238 Visual Basic.NET을 사용 하 여 ASP.NET 응용 프로그램에서 폼 기반 인증을 사용 하 여 역할 기반 보안을 구현 하는 방법

313091 폼 인증에 사용 하기 위해 Visual Basic.NET을 사용 하 여 키를 만드는 방법

313116 폼 인증 요청을 loginUrl 페이지로 이동 되지 않습니다.

속성

문서 ID: 326340 - 마지막 검토: 2017. 2. 7. - 수정: 2

피드백