다음을 통해 공유


방법: Windows 통합 보안을 사용한 SQL Server 액세스

업데이트: 2007년 11월

응용 프로그램이 Windows 기반 인트라넷에서 실행되는 경우 Windows 통합 인증을 사용하여 데이터베이스에 액세스할 수 있습니다. 통합 보안에서는 운영 체제 스레드에 설정된 현재 Windows ID를 사용하여 SQL Server 데이터베이스에 액세스합니다. 그런 다음 Windows ID를 SQL Server 데이터베이스 및 사용 권한과 매핑할 수 있습니다.

Windows 통합 인증을 사용하여 SQL Server에 연결하려면 현재 실행 중인 ASP.NET 응용 프로그램에 사용된 Windows ID를 식별해야 합니다. 또한 해당 ID에 SQL Server 데이터베이스에 액세스할 수 있는 권한이 있는지 여부도 확인해야 합니다. 이 항목에는 ASP.NET 응용 프로그램의 현재 Windows ID를 표시하는 코드 예제가 포함되어 있습니다.

SQL Server에 연결

SQL Server가 웹 서버와 다른 컴퓨터에 있는 경우에는 네트워크를 통해 Windows ID를 SQL Server의 원격 인스턴스로 전달할 수 있어야 합니다. Kerberos 인증으로 적절하게 구성된 Windows 네트워크에서는 이를 수행할 수 있습니다. 그러나 ASP.NET 응용 프로그램의 운영 체제 스레드에 설정된 Windows ID는 identity 구성 요소의 설정에 따라 원격 SQL Server로 전달되지 않을 수도 있습니다.

방법: 매핑된 Windows 도메인 사용자를 사용하여 SQL Server에 액세스에 나와 있는 대로 웹 사이트의 작업자 프로세스 ID에 특정 사용자 이름과 암호를 제공하거나 IIS(인터넷 정보 서비스)에서 제공한 인증된 ID를 가장할 수 있습니다. IIS에서 제공한 Windows ID를 가장하려면 다음 예제와 같이 identity 구성 요소의 impersonate 특성을 true로 설정합니다.

<system.web>
  <identity impersonate="true" />
</system.web>

IIS에서는 기본 인증을 사용할 경우에만 네트워크를 통해 원격 SQL Server로 전달되는 보안 토큰으로 사용자를 로그온할 수 있습니다. 기본적으로 identity 구성 요소 설정과 함께 사용되는 다른 IIS 보안 모드에서는 원격 SQL Server에 인증을 제공할 수 있는 토큰이 만들어지지 않습니다.

IIS에서 익명 액세스만 지원하도록 웹 사이트가 구성된 경우, IIS에서 구성된 대로 익명 액세스용 Windows 사용자 계정의 토큰이 IIS에서 전달됩니다. 익명 사용자 계정을 사용하면 원격 SQL Server에 대해 인증할 수 있습니다. 그러나 기본 익명 사용자 계정은 로컬 컴퓨터 계정이므로 원격 SQL Server의 계정으로 존재하지 않습니다. 도메인 계정을 사용하도록 IIS 익명 계정을 변경하거나, 원격 SQL Server에서 같은 사용자 이름과 암호로 로컬 계정을 만들어 원격 SQL Server에서 로컬 컴퓨터 계정을 미러링할 수 있습니다. 또한 IIS6의 LogonMethod 메타베이스 속성을 네트워크를 통해 자격 증명을 전달할 수 있는 옵션으로 설정해야 합니다. 예를 들어 메타베이스 설정 MD_LOGON_NETWORK_CLEARTEXT를 사용하면 네트워크를 통해 로그온 자격 증명을 전달할 수 있습니다.

응용 프로그램의 Windows ID 이름 및 네트워크를 통해 전달할 수 있는 토큰으로 이 ID가 로그온되었는지 여부를 잘 모르면 다음 ASP.NET 페이지를 응용 프로그램의 일부로 실행하여 Windows ID의 이름 및 네트워크를 통해 이 ID를 전달할 수 있는지 여부를 나타내는 값을 표시합니다. 다음 샘플에서는 도메인에 Kerberos 위임이 제대로 설정되어 있는지 여부를 고려하지 않습니다.

<%@ Page Language="VB" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>ASP.NET Example</title>
<script >

Public Function WillFlowAcrossNetwork(w As WindowsIdentity) As Boolean
  For Each s As SecurityIdentifier In w.Groups
    If s.IsWellKnown(WellKnownSidType.InteractiveSid) Then Return True
    If s.IsWellKnown(WellKnownSidType.BatchSid)       Then Return True
    If s.IsWellKnown(WellKnownSidType.ServiceSid)     Then Return True
  Next

  Return False
End Function

</script>
</head>
<body>
<%
  Dim current As WindowsIdentity =  WindowsIdentity.GetCurrent()
  Response.Write(current.Name & ", " & WillFlowAcrossNetwork(current) & "<br />")
%>
</body>
</html>
<%@ Page Language="C#" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>ASP.NET Example</title>
<script >

public bool WillFlowAcrossNetwork(WindowsIdentity w)
{
  foreach (SecurityIdentifier s in w.Groups)
  {
    if (s.IsWellKnown(WellKnownSidType.InteractiveSid)) { return true; }
    if (s.IsWellKnown(WellKnownSidType.BatchSid))       { return true; }
    if (s.IsWellKnown(WellKnownSidType.ServiceSid))     { return true; }
  }

  return false;
}

</script>
</head>
<body>
<%
  WindowsIdentity current =  WindowsIdentity.GetCurrent();
  Response.Write(current.Name + ", " + WillFlowAcrossNetwork(current) + "<br />");
%>
</body>
</html>

다음 절차에서는 각 사용자가 개별적으로 SQL Server에 액세스할 수 있는 인트라넷 시나리오에서 Windows 통합 인증을 사용하여 SQL Server 데이터베이스에 액세스하는 방법을 보여 줍니다.

시작하기 전에 IIS에서 해당 응용 프로그램에 대해 익명 액세스를 해제하고 Windows 인증을 설정해야 합니다.

IIS에서 Windows 통합 인증을 구성하려면

  1. Windows에서 인터넷 정보 서비스 관리 도구를 엽니다.

    • Microsoft Windows 2000 Server 또는 Windows Server 2003 운영 체제의 경우 Windows 시작 메뉴에서 프로그램, 관리 도구, 인터넷 서비스 관리자를 차례로 가리킵니다.

    • Microsoft Windows XP Professional 운영 체제의 경우 제어판에서 관리 도구를 엽니다.

  2. 서버의 노드를 연 다음 응용 프로그램 노드를 찾을 때까지 계속 노드를 엽니다. 응용 프로그램 노드는 대개 기본 웹 사이트 아래 있습니다.

  3. 응용 프로그램을 마우스 오른쪽 단추로 클릭한 다음 속성을 클릭합니다.

  4. 디렉터리 보안 탭에서 편집을 클릭합니다.

  5. 인증 방법 대화 상자에서 액명 액세스 확인란의 선택을 취소하고 다음 중 하나를 수행합니다.

    • SQL Server가 IIS와 같은 컴퓨터에 있는 경우에는 Windows 통합 인증 확인란을 선택합니다.

    • SQL Server가 원격 서버인 경우에는 기본 인증 확인란을 선택하고 Windows 통합 인증 확인란의 선택을 취소합니다.

  6. 모든 대화 상자를 클릭합니다.

응용 프로그램 구성 파일(Web.config)에서 해당 응용 프로그램이 IIS에서 제공한 사용자 자격 증명을 가장하도록 지정합니다.

IIS에서 제공한 ID를 가장하도록 Web.config 파일을 구성하려면

  • 응용 프로그램의 Web.config 파일을 열고 system.web 요소에 다음 코드를 추가합니다.

    <identity impersonate="true"/>
    
    참고:

    Web.config 파일의 요소는 대/소문자를 구분합니다.

SQL Server에 액세스할 때 사용할 연결 문자열을 만드는 경우에는 통합 보안이 사용되고 있음을 SQL Server에 알려 주는 특성을 포함해야 합니다.

Windows 통합 보안을 위한 연결 문자열을 구성하려면

  • SQL Server에 대한 모든 연결 문자열에 대해 Trusted_Connection=Yes 특성을 포함하고 username 및 password 특성은 제거합니다.

    다음은 Windows 통합 보안을 위해 구성된 일반적인 연결 문자열입니다.

    "workstation id=WebServer1;packet size=4096;
    Trusted_Connection=Yes;data source=SQLServer01";
    persist security info=False;initial catalog=northwind"
    

액세스할 사용자를 인식하도록 SQL Server를 설정합니다.

Windows 통합 보안을 위한 SQL Server를 구성하려면

  1. Windows 시작 메뉴에서 Microsoft SQL Server를 선택한 다음 엔터프라이즈 관리자를 선택합니다.

  2. 서버 노드를 열고 사용자에게 권한을 부여할 데이터베이스 노드를 확장합니다.

  3. 사용자 노드를 마우스 오른쪽 단추로 클릭하고 새 데이터베이스 사용자를 선택합니다.

  4. 데이터베이스 사용자 속성 대화 상자에서 로그인 이름 상자에 domain\username 값을 입력한 다음 확인을 클릭합니다. 또한 모든 도메인 사용자가 데이터베이스에 액세스할 수 있도록 SQL Server를 구성합니다.

참고 항목

개념

ASP.NET 가장

웹 응용 프로그램에서 SQL Server 액세스

기타 리소스

ASP.NET 웹 사이트 보안