SharePoint 2010과 함께 사용자 지정 클레임 공급자에서 Secure Store Service 사용
SharePoint 2010과 함께 사용자 지정 클레임 공급자에서 Secure Store Service 사용
최근에 작업 중이던 사용자 지정 클레임 공급자에서 SSS(Secure Store Service)를 사용하던 중 한 가지 좋은 방법을 발견하게 되었습니다. 다른 사람들도 하고자 하는 작업, 즉 사용자 지정 클레임을 확대하는 작업을 하고 있었기 때문에 이 시나리오는 정말로 흥미롭습니다. 각 사용자에 대한 추가 정보를 쿼리할 수 있도록 원격 데이터 원본에 연결한 다음 이 정보를 사용하여 확대하거나 그렇지 않을 클레임을 결정해야 했습니다.
사용자 지정 클레임 공급자에서 데이터 원본을 사용할 경우 사용자 지정 클레임 공급자 어셈블리가 SharePoint STS 프로세스에 의해 메모리에 남는다는 점을 반드시 기억해야 합니다. 따라서 데이터 집합이 됐든 자격 증명이 됐든 정보가 클래스 수준 변수에 저장되어 다음 IISRESET이 수행될 때까지 사용할 수 있으므로 정보를 검색하기가 훨씬 쉽습니다. 이때 한 가지 제한은 일부 SharePoint 팜 리소스의 경우 사용자 지정 클레임 공급자가 인스턴스화될 때까지 사용할 수 없을 수도 있다는 점입니다. 이것이 바로 오늘 이야기의 교훈입니다.
이와 같은 경우 사용자 지정 클레임 공급자의 생성자에서 SSS의 데이터를 검색하고 싶었습니다. 그런 다음 이 데이터로 뭔가 다른 작업을 하려고 했습니다. 제 경우 단방향 트러스트를 통해 도메인에서 WindowsIdentity를 만들어 원격 Active Directory를 쿼리할 수 있는 권한이 있는 가장 컨텍스트를 만들었습니다. 그런데 생성자에서 SSS에 대한 참조를 사용하여 무언가를 하려고 하면 문제가 발생했습니다. 즉, 항상 시간이 초과되는 문제가 발생했습니다. SSS에 대해 어떤 메서드가 호출되었는지는 문제가 되지 않았습니다. 항상 60초가 지나면 시간 초과 오류와 함께 작업이 실패했습니다.
이 문제는 생성자에서 코드를 제거하는 것으로 간단히 해결되었습니다. 똑같은 코드를 FillClaimsForEntity 메서드 재정의에서 호출할 때는 완벽하게 실행되었습니다. 완전히 운으로 문제가 해결되었지만 이 정보를 다른 사람과 공유하는 것이 좋다고 생각되었습니다.
이 문제(원격 도메인에 로그인 및 가장)에 대해 자세히 검토하면서 알아낸 한 가지 패턴과 또 다른 한 가지 패턴을 시도해 볼 가치가 있다고 생각합니다.
위에서 설명한 바와 같이 어셈블리는 STS 프로세스에 로드된 상태로 남아 있으므로 클래스 수준 변수에 대한 연결을 유지할 수 있습니다. 저는 원격 도메인을 쿼리해야 할 때마다 도메인에 반복해서 로그인하고 싶지 않았기 때문에 WindowsIdentity용 클래스 수준 변수를 만들었습니다. 패턴은 다음과 같았습니다.
- SSS 자격 증명이 검색되었는지 확인
- 검색되지 않았으면 다음 작업을 수행하는 코드를 실행합니다.
- SSS에서 자격 증명을 검색합니다.
- LogonUser API를 사용하고 SSS에서 검색한 자격 증명을 사용하여 원격 도메인에 로그온합니다.
- WindowsIdentity 변수를 인스턴스화하여 원격 사용자의 자격 증명을 사용합니다.
- 검색되지 않았으면 다음 작업을 수행하는 코드를 실행합니다.
- WindowsIdentity 변수가 Null이 아닌지 확인
- Null이 아니면 다음 작업을 수행하는 코드를 실행합니다.
- WindowsIdentity.Impersonate()에서 WindowsImpersonationContext의 새 인스턴스를 만듭니다.
- 원격 도메인을 쿼리합니다.
- WindowsImpersonationContext에 대해 Undo를 호출합니다.
- Null이 아니면 다음 작업을 수행하는 코드를 실행합니다.
이 패턴은 제대로 작동하는 것 같고 지금까지 사용할 정도로 성능이 괜찮았습니다. 여러분은 WindowsIdentity 인스턴스에 대해 Impersonate()를 호출하기를 바라지 않으며 그 이후에 결과 WindowsImpersonationContext에 대해 Undo를 호출하는 것을 바라지 않습니다. 제 경험으로 미루어 봤을 때 가장을 취소하지 않으면 사이트가 더 이상 렌더링되지 않습니다. Undo 호출을 다시 추가하면 모든 것이 제대로 작동합니다.
이 문서는 번역된 블로그 게시물입니다. 원본 문서는 Using Secure Store Service in a Custom Claims Provider with SharePoint 2010을 참조하십시오.