LDAP 폼 인증 구성 및 폼 인증 시 고려 사항
이 문서는 마이크로소프트의 공식 문서가 아닙니다. 공식적인 가이드는 technet.microsoft.com - Plan authentication settings for Web applications in Office SharePoint Server 를 참고 하시기 바랍니다.
안녕하세요. 저는 한국 MS의 MOSS 담당 TS인 송치훈 이라고 합니다. 아래 내용은 ASP.NET 의 LDAP 인증 프로바이더를 사용하여 폼 인증을 구성하는 법과 기술적으로 고려해야 할 사항, 제약 사항을 정리한 것입니다. MS 본사 엔지니어인 Steve Peschka의 게시글을 참고 하였으며 테스트는 직접 수행한 결과를 바탕으로 기술 하였습니다. 많은 참고가 되시길 바랍니다.
목차:
A. 기 구축된 웹 사이트의 인증 다중화
B. 폼 인증 기반의 신규 웹 어플리케이션 생성
C. 클라이언트 연동 테스트
A. 기 구축된 웹 사이트의 인증 다중화
아래 예제는 이미 AD 인증으로 구성된 사이트에 폼 인증을 추가하는 것을 보여주고 있습니다. 사이트를 완전히 폼 인증 기반으로 하고 싶으면 B 항목으로 가십시오.
1. 웹 어플리케이션 관리에서 웹 어플리케이션을 확장하여야 합니다. 웹 어플리케이션 생성 또는 확장 메뉴로 가십시오.
2. 어플리케이션 확장을 선택합니다. 이 예제는 이미 구축된 사이트의 인증 방식을 다중화 하는 예제입니다.
확장하고자 하는 기본 웹 어플리케이션을 선택합니다. (예 : 80번 포트 쓰는 것)
웹 어플리케이션의 포트를 부여합니다. (예 : 12345)
Zone 을 반드시 바꾸어 주어야 합니다. 여기서는 “Extranet” 존을 선택합니다.
3. 인증 프로바이더 메뉴로 갑니다.
여기서 “Extranet” 존을 선택하여 이 존을 폼인증으로 구성합니다.
웹 어플리케이션을 선택하고,
인증 타입 부분에서 폼 인증으로 선택해 줍니다.
멤버십 프로바이더 이름과 롤 매니저 이름을 적어줍니다.
클라이언트 통합 부분을 사용하겠다고 체크합니다.
4. IIS 가상 디렉토리로 가서 Web.config 를 수정합니다.
5. 메모장이나 비쥬얼 스튜디오를 이용해서 <securityPolicy> 태그 앞에 다음 코드를 삽입합니다.
기본 LDAP 프로바이더 설정으로 AD 를 연결합니다.
<membership defaultProvider="Partners" userIsOnlineTimeWindow="15">
<providers>
<!--LDAP Provider-->
<add name="Partners"
type="Microsoft.Office.Server.Security.LDAPMembershipProvider,
Microsoft.Office.Server,
Version=12.0.0.0,
Culture=neutral,
PublicKeyToken=71E9BCE111E9429C"
server="moss.litwareinc.com"
port="389"
useSSL="false"
userDNAttribute="distinguishedName"
userNameAttribute="SAMAccountName"
userContainer="CN=Users,DC=litwareinc,DC=com"
userObjectClass="person"
userFilter="(|(ObjectCategory=group)(ObjectClass=person))"
scope="Subtree"
otherRequiredUserAttributes="sn,givenname,cn" />
</providers>
</membership>
<roleManager
defaultProvider="PartnerRoles"
enabled="true"
cacheRolesInCookie="true"
cookieName=".ASPROLES"
cookieTimeout="30"
cookiePath="/"
cookieRequireSSL="true"
cookieSlidingExpiration="true"
cookieProtection="All">
<providers>
<!--LDAP Role Provider-->
<add name="PartnerRoles"
type="Microsoft.Office.Server.Security.LDAPRoleProvider,
Microsoft.Office.Server,
Version=12.0.0.0,
Culture=neutral,
PublicKeyToken=71E9BCE111E9429C"
server="moss.litwareinc.com"
groupContainer="DC=litwareinc,DC=com"
groupNameAttribute="cn"
groupMemberAttribute="member"
userNameAttribute="SAMAccountName"
dnAttribute="distinguishedName"
groupFilter="(ObjectClass=group)"
scope="Subtree" />
</providers>
</roleManager>
저장하고 IISRESET 수행합니다.
6. 어플리케이션 관리 페이지로 가서
사이트 컬렉션 관리자에서 Partners:administrator 라고 추가한 후
이름 확인을 하면 이를 “administrator” 로 인식하는 것을 볼 수 있습니다.
이는 내부적으로 계정 개체가 두 개 생긴 것입니다.
계정 검색을 해보면 실제로는 같은 계정이지만 두 개가 있는 것을 알 수 있습니다.
하지만 다른 웹 어플리케이션에는 이 계정이 존재하지 않습니다.
웹 어플리케이션을 바꾸면 더 이상 Partners:administrator 는 검색되지 않습니다.
그래서 새로 만든 폼 인증 으로 로그인 해 보면…
AD 계정으로는 로그인이 되지 않습니다. 인증 프로바이더가 인식하지 못하기 때문입니다.
AD 를 LDAP 프로바이더로 연결할 지라도, 프로바이더가 틀리면 SharePoint는 완전히 다른 계정으로 인식합니다. 따라서, AD 로그인과 LDAP 프로바이더 로그인을 동시에 사용하는 유저는 “도메인 로그인한 상태에서 작성한 문서를 LDAP 폼인증으로 로그인하면 수정할 수 없는” 등의 문제를 겪을 수 있습니다 .
그냥 administrator 라고 치고 들어가야 인증을 통과합니다. 이것은 위에서의 “Partners:administrator” 입니다.
여기서 Sign me in automatically 를 선택하면 persistent cookie 를 생성하게 됩니다.
B. 폼 인증 기반의 신규 웹 어플리케이션 생성
자 이번엔 새 웹 어플리케이션을 만들기로 폼인증을 구성해 보겠습니다.
응용 프로그램 관리에서 새 응용 프로그램 만들기부터 시작합니다.
인증 공급자 메뉴로 가서…
기본 인증을 폼 인증으로 바꿉니다.
편의상 앞에서 만들었던 LDAP 프로바이더를 재활용 합니다. (이름만 좀 바꿔서)
폼 인증을 위해서는
- 멤버십 프로바이더를 웹 어플리케이션(여기서는 12345)의 Web.config 에 추가
- 롤 매니저를 Web.config 에 추가
- 멤버십 프로바이더를 중앙 관리 사이트 Web.config 에 추가 (중요!)
해 주어야 합니다.
샘플 LDAP 멤버십 프로바이더는 아래와 같습니다.
<membership defaultProvider="LDAPMemProv" userIsOnlineTimeWindow="15">
<providers>
<!--LDAP Provider-->
<add name="LDAPMemProv"
type="Microsoft.Office.Server.Security.LDAPMembershipProvider,Microsoft.Office.Server,Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C" server="iwsoft2" port="389" useSSL="false" userDNAttribute="distinguishedName" userNameAttribute="SAMAccountName" userContainer="CN=Users,DC=iwsoft,DC=com" userObjectClass="person" userFilter="(|(ObjectCategory=group)(ObjectClass=person))" scope="Subtree" otherRequiredUserAttributes="sn,givenname,cn" />
</providers>
</membership>
<roleManager defaultProvider="LDAPRoleProv" enabled="true" cacheRolesInCookie="true" cookieName=".ASPROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="true" cookieSlidingExpiration="true" cookieProtection="All">
<providers>
<!--LDAP Role Provider-->
<add name="LDAPRoleProv" type="Microsoft.Office.Server.Security.LDAPRoleProvider, Microsoft.Office.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C" server="iwsoft2" groupContainer="DC=iwsoft,DC=com" groupNameAttribute="cn" groupMemberAttribute="member" userNameAttribute="SAMAccountName" dnAttribute="distinguishedName" groupFilter="(ObjectClass=group)" scope="Subtree" />
</providers>
</roleManager>
중앙 관리자의 Web.config 에 입력할 코드는 아래와 같습니다. 노란색으로 하이라이트 된 부분이 틀립니다. 이유는 중앙 관리 사이트는 폼인증을 사용하지 않기 때문에, 롤 프로바이더로 윈도우 인증을 사용하기 때문에 AspNetWindowsTokenRoleProvider 를 디폴트 프로바이더로 해 주어야 합니다.
<membership defaultProvider="LDAPMemProv" userIsOnlineTimeWindow="15">
<providers>
<!--LDAP Provider-->
<add name="LDAPMemProv"
type="Microsoft.Office.Server.Security.LDAPMembershipProvider,Microsoft.Office.Server,Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C" server="iwsoft2" port="389" useSSL="false" userDNAttribute="distinguishedName" userNameAttribute="SAMAccountName" userContainer="CN=Users,DC=iwsoft,DC=com" userObjectClass="person" userFilter="(|(ObjectCategory=group)(ObjectClass=person))" scope="Subtree" otherRequiredUserAttributes="sn,givenname,cn" />
</providers>
</membership>
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
<providers>
<!--LDAP Role Provider-->
<add name="LDAPRoleProv" type="Microsoft.Office.Server.Security.LDAPRoleProvider, Microsoft.Office.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C" server="iwsoft2" groupContainer="DC=iwsoft,DC=com" groupNameAttribute="cn" groupMemberAttribute="member" userNameAttribute="SAMAccountName" dnAttribute="distinguishedName" groupFilter="(ObjectClass=group)" scope="Subtree" />
</providers>
</roleManager>
기본 인증 공급자가 바뀐 것을 확인할 수 있습니다.
다음은 웹 응용 프로그램 정책 메뉴로 갑니다.
올바른 웹 어플리케이션을 선택하고 사람 검색을 클릭합니다.
여기서 계정이 검색되어야 합니다. 그렇지 않으면 프로바이더 코드가 잘못 된 것입니다. 또한 영역 선택에 주의해야 합니다. (만약 확장을 했을 경우)
계정이 추가 되었습니다.
다음은 사이트 컬렉션을 만듭니다. 역시 ldapmemprov:administrator 로 계정이 resolve 되어야 합니다.
Resolve 확인
사이트 모음을 만들고 들어가면 로그인 페이지를 볼 수 있어야 합니다.
로그인 해 들어가면 우측 상단에 내 사이트 링크가 나오지 않습니다.
당연합니다. Ldapmemprov:administrator 가 내 사이트 서비스를 받을 권한이 없기 때문입니다.
이 권한은 공유 서비스에서 주어야 합니다.
공유 서비스의 내 사이트 설정으로 가서…
기본 독자 사이트 그룹에서 사람 찾기를 누르고 administrator 를 찾아 보면, 폼인증 유저인 ldapmemprov:administrator 는 나오지 않을 것입니다. 이는 ldapmemprov:administrator 가 공유 서비스 웹 어플리케이션에 없기 때문입니다. (공유 서비스를 위한 웹 어플리케이션을 별도로 생성했을 경우입니다.)
폼인증 유저가 추가되도록 하기 위해서는 웹 어플리케이션 존을 추가해 주어야 합니다. 위의 웹 어플리케이션 확장의 경우와 마찬가지로, 다음 작업을 수행해 주어야 합니다.
- 공유 서비스 웹 어플리케이션을 확장하여 웹 어플리케이션을 하나 더 만들고
- 그 웹 어플리케이션을 폼인증으로 구성 (web.config 수정)
그런 이후에야 다음 처럼 폼인증 유저가 검색될 것입니다.
다음 단계로는 폼 인증 유저에게 내 사이트 서비스를 받을 수 있도록 권한을 줍니다.
개인 설정 서비스 권한에 들어가서 사용자 추가를 누르고…
폼인증 유저를 추가하면서, 개인사이트 만들기 권한과 개인 기능 사용 권한을 줍니다.
다음과 같이 추가 되었습니다.
이제 드디어 내 사이트 링크를 볼 수 있습니다.
C. 클라이언트 연동 테스트
폼 인증 구성시에는 기본으로 “클라이언트 통합” 기능이 비활성화 됩니다. 하지만 이를 활성화 시켰을 경우 어떠한 반응을 보이는지 테스트 합니다. 결론부터 말씀드리면 폼인증 구성 시 클라이언트 통합을 제대로 사용하려면 로그인 화면에서 “자동으로 로그인” 옵션으로 로그인 해야 합니다. 이 옵션을 사용하면 사용자의 PC에 persistent cookie 가 생성 되게 되며, 오피스 클라이언트는 이 정보를 기반으로 클라이언트와 상호 작용 하게 됩니다. 자동으로 로그인 옵션을 사용하지 않으면 세션 쿠키가 생기게 되고, 이는 메모리 기반으로, 웹 브라우저만이 엑세스 할 수 있습니다. Persistent cookie 가 생성되면 Office client 들이 이 정보를 읽어 추가 로그인 없이 MOSS 에 엑세스 할 수 있습니다. 세부 사항은 아래 테크넷 문서를 참고 부탁 드립니다.
(https://technet2.microsoft.com/Office/f/?en-us/library/d3e0e0fc-77b6-4109-87d6-53ad088db01d1033.mspx)
주의할 사항은, Persistent Cookie는 기본 만료 시간이 지정되어 있으므로(변경가능) 이 시간이 지나게 되면 클라이언트 연동 기능이 작동을 중지하게 됩니다. 쿠키 만료시 웹 브라우저를 통해 다시 로그인을 해 주어야 하는 번거로움이 있습니다 .
우선 폼 인증시 계정이 어떻게 취급 되는지부터 한번 알아 보도록 하겠습니다. B절의 LDAP 프로바이더 코드에서 userNameAttribute="SAMAccountName" 을 사용하였을 경우 표시 이름은 alias 로 나타나게 됩니다. Active Directory 의 Display Name 이 나오지 않습니다.
이 사항은 현재 버그로써 MOSS 의 LDAP 인증 프로바이더가 패치가 되어야 할 사항입니다. 패치 이전에, 커스텀 인증 프로바이더를 직접 제작하는 방법을 검토해볼 수 있습니다. (아직 확인 안됨)
userNameAttribute="cn" 으로 지정할 경우는 아래와 같습니다.
Display Name 이 나오기는 하지만, 로그인 계정을 Luis Bonifaz 로 해야 합니다. Luis Bonifaz 의 alias 는 luisB 입니다.
아래를 비교해 보시면 알 수 있습니다. MikeF 는 userNameAttribute="SAMAccountName”, 으로 했을 경우이며(Display Name은 Mike Fitzmaurice) Luis Bonifaz 는 userNameAttribute="cn"으로 프로바이더 코드를 수정하여 로그인 한 것입니다.
또 한가지 알 수 있는 사실은 중간에 프로바이더 코드를 바꾼다고 해서, 사이트에 이미 들어가 있는 계정의 유형이 바뀌지는 않는다는 사실입니다. 이 부분은 프로파일 동기화를 하지 않은 상태에서 테스트 한 것이기 때문에 조금 더 검증의 여지가 있으나, 근본적인 이유는 위의 두 계정은 사이트의 사용자 데이터 베이스에 이미 추가된 상태로 있기 때문입니다.
또 한가지 기억해야 할 사실은, FBA 계정으로 로그인 하게 되면, LCS 의 상태 정보나, 아웃룩과 연계되는 Exchange 의 일정 정보, 연락처 정보, 프로파일 정보 등이 연동이 될 수 없습니다.
그럼 여타의 Office 클라이언트들의 연동 기능을 테스트 해 보겠습니다.
우선 폼 인증 설정 항목에서 클라이언트 통합을 사용으로 설정하여야 합니다.
아래 테스트는 도메인 조인 되어 있지 않은 워크그룹 PC (Windows XP) 에서 테스트 하였습니다.
1. Persistent Cookie 를 사용할 경우의 클라이언트 상호 작용
A. 자동으로 로그인 옵션 선택하고 로그인 (Persistent Cookie 의 생성)
B. 문서 라이브러리에서 새 문서 만들기 테스트
인증창 뜨지 않고 바로 넘어감
저장 테스트
역시 인증창 없이 잘 저장됩니다.
C. 탐색기 연동
인증창 없이 탐색기가 웹폴더 형태로 바로 열림.
D. 아웃룩 연동
문서라이브러리의 아웃룩 연결 테스트
인증창 없이 잘 동기화 됨.
E. 인포패스 연동
양식 라이브러리에서 새 인포패스 양식 생성
인증창 없이 잘 뜸.
폼 게시 역시 인증창 없이 잘 됨.
웹 브라우저를 닫고, 인포패스만 띄워서 폼 열기나 양식 라이브러리로 저장해도 인증창 없이 잘 됨.
2. Persistent Cookie 를 사용하지 않을 때의 상호 작용
자동으로 로그인을 체크하지 않거나,
브라우저에서 쿠키를 모두 삭제해 버리면 Persistent Cookie 가 없는 상태의 테스트를 할 수 있음
A. 인포패스 양식 라이브러리에서 새 양식 만들기 테스트
양식을 만들 수 없는 오류 발생. 윈도우 인증이 구성된 상태라면 인증창이 떴을 것임.
B. 문서 라이브러리에서 워드 문서 열기 테스트
열려야 할 문서가 열리지 않고, 로그인 창이 문서로 열리는 오류 발생 합니다. 이것을 처리해 주시려면, 커스텀 HTTP Handler 를 작성하여 FBA 사이트의 인증 프롬프트를 가로채서 기본 인증 프롬프트로 뜨도록 해 주어야 합니다.
C. 탐색기 연동 테스트
탐색기는 웹 폴더 형태로 별다른 문제 없이 열림
D. 아웃룩 연동 테스트
실제 문서는 동기화 되지 않고 빈 채로 나타남
위 테스트 결과로 인터넷 익스플로러가 만들어 주는 것과 동일한 Persistent Cookie 를 생성해 준다면 워크그룹에 속해 있는 PC에서도 인증 창 뜨는 일 없이 대부분의 클라이언트 연동 기능을 활용할 수 있게 된다는 것을 알 수 있습니다.
참고 :
https://technet2.microsoft.com/Office/f/?en-us/library/40117fda-70a0-4e3d-8cd3-0def768da16c1033.mspx
https://technet2.microsoft.com/Office/f/?en-us/library/40117fda-70a0-4e3d-8cd3-0def768da16c1033.mspx
SUN LDAP 프로바이더 코드 예제 ( by Steve Peschka )
<membership defaultProvider="LdapMembership">
<providers>
<add name="LdapMembership"
type="Microsoft.Office.Server.Security.LDAPMembershipProvider, Microsoft.Office.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"
server="pctx-ipl.ctxportals.com" port="21801" useSSL="false" userDNAttribute="entryDN"
userNameAttribute="uid" userContainer="dc=CTXPORTALS,dc=COM"
userObjectClass="Inetorgperson" userFilter="(ObjectClass=Inetorgperson)"
scope="Subtree" otherRequiredUserAttributes="sn,givenname,cn" />
</providers>
</membership>
<roleManager defaultProvider="LdapRole" enabled="true" cacheRolesInCookie="true" cookieName=".PeopleDCRole">
<providers>
<add
name="LdapRole"
type="Microsoft.Office.Server.Security.LDAPRoleProvider, Microsoft.Office.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"
server="pctx-ipl.ctxportals.com"
port="21801"
useSSL="false"
groupContainer="dc=CTXPORTALS,dc=COM"
groupNameAttribute="cn"
groupMemberAttribute="uniqueMember"
userNameAttribute="uid"
dnAttribute="entryDN"
groupFilter="(ObjectClass=groupofuniquenames)"
scope="Subtree"
/>
</providers>
</roleManager>