Partager via


SharePoint 2010의 사용자 지정 양식 로그인 페이지 작성: 1부

SharePoint 2010의 사용자 지정 양식 로그인 페이지 작성: 1부

SharePoint 2007에서는 FBA(양식 기반 인증)를 위한 사용자 지정 로그인 페이지를 작성하기가 그다지 힘들지 않았습니다. 대부분 SharePoint와 관련이 없는 몇 가지 사항과 로그인 양식의 모양과 느낌을 표준 SharePoint 레이아웃 페이지처럼 만들기 위한 몇 가지 팁을 알아야 했습니다. 그리고 전반적으로 ASP.NET과 FormsAuthentication 클래스에 대해 알고 있으면 모든 과정이 순조로웠습니다. 하지만 공교롭게도 SharePoint 2010에서는 상황이 약간 복잡해졌습니다.

이 게시물에서는 사용자 지정 로그인 페이지의 한 가지 시나리오를 살펴보겠습니다. 이 예제에서는 완전한 사용자 지정 로그인 페이지가 필요한 것으로 정하겠습니다. 즉, 모양과 느낌만 바꾸는 것이 아니라 완전히 다른 UI가 필요한 것입니다. 예를 들어 로그인 시 사용되는 멤버 자격 증명을 확보한 다음 SecurID를 사용하는 경우처럼 누군가가 보조 인증 ID를 입력하도록 해야 할 수도 있습니다. 이러한 경우에 대비해 ASP.NET 페이지에 사용자 이름과 암호를 위한 두세 개의 텍스트 상자를 만들고 이를 활용하여 사용자가 프로그래밍 방식으로 로그인하도록 해야 합니다.

여기서 기억해야 할 가장 중요한 부분은 오랫동안 사용해 온 FormsAuthentication 클래스를 더 이상 사용하지 않는다는 점입니다. 그 이유는 SharePoint 2010의 경우 FBA 사용자가 실제로 클레임 사용자이기 때문입니다. 따라서 표준 ASP.NET 멤버 자격 사용자 및 역할 공급자로 작업한다고 생각할 수 있지만 자세히 살펴보면 이러한 개체에는 새로운 클레임 인증 셸이 있음을 알 수 있습니다. 이 때문에 일부 SharePoint 클레임 클래스를 사용하여 FBA 로그인 프로세스를 진행해야 합니다.

여기서 주의할 사항이 한 가지 더 있습니다. 대개는 어떤 방법으로든 블로그에 글을 게시하기 전에 누군가와 함께 최대한 내용을 파악하거나 검증하는 과정을 거치는데 이는 어떤 일을 진행하는 적절하고 효과적이며 믿을 만한 방법입니다. 여기서도 저 역시 다른 사람의 검증을 받으려 여러 차례 시도했지만 그렇게 하지 못했습니다. 이곳에 제시된 코드는 제가 수행했던 프로젝트에서 사용한 것이며 올바로 작동합니다. 하지만 코드를 잘 아는 다른 사람이 나중에 훨씬 더 효율적이고 적절한 방식으로 코드를 수정해야 한다고 여러분에게 말할 수 있으므로 당황하지 않게 미리 주지하시는 것이 좋을 것 같습니다. 따라서 문제가 생길 경우를 충분히 이해했다면 일부 코드를 살펴보겠습니다.

시작하기 전에 필요한 몇 가지 참조가 있는데 아마 여러분은 이전에 사용해 본 적이 없을 것입니다. 첫 번째 참조는 ISAPI 폴더의 14 하이브에 있는 Microsoft.SharePoint.Security.dll입니다. 다른 하나는 좀 더 까다로운데, 앞에서 경고한 이유도 주로 이 참조 때문입니다. 바로 Microsoft.SharePoint.IdentityModel.dll에 대한 참조가 필요합니다. 하지만 참조를 추가하려 보면 이 어셈블리를 쉽게 찾을 수 없을 것입니다. 그래서 제가 약간 불안하면서도 조심스러워 하는 부분이기도 합니다. 다른 게시물에서 설명했듯이 가장 효과적인 검색 방법은 이를 파일 시스템에서 확인하여 찾기 쉬운 위치에 복사한 다음 복사한 버전에 대한 참조를 추가하는 것입니다. 보수적인 성향 탓에 저 같은 경우는 주로 명령 프롬프트에서 루트 드라이브로 이동한 다음 “dir Microsoft.SharePoint.IdentityModel.dll /s”을 실행하여 찾습니다. 이렇게 하고 나면 다음과 같은 명령문을 사용하는 작은 코드 모음을 추가해야 할 수 있습니다.

using System.Web.Security;

using System.IdentityModel.Tokens;

using Microsoft.SharePoint;

using Microsoft.SharePoint.IdentityModel;

이제, 다루기 힘든 부분을 일부 처리했으니 사용자가 입력한 FBA 사용자 자격 증명의 유효성을 검증하기 위해 클레임 클래스로 호출할 때, 어떤 멤버 자격과 역할 공급자를 사용해야 할지를 명시하는 작업을 수행해 보겠습니다. 이 경우 그냥 이름만 있으면 됩니다. 저 같은 경우는 제가 수행하는 작업에 맞게 사용자 지정 멤버 자격과 역할 공급자를 작성했으므로, 작성한 항목을 찾을 때까지 웹 응용 프로그램에서 인식하는 공급자를 모두 열거했습니다.

//get the provider names for our type

string userProviderName = string.Empty;

string roleProviderName = string.Empty;

//get the membership provider name

foreach (MembershipProvider p in Membership.Providers)

{

if (p.GetType().Equals(typeof(Microsoft.SE.AnonProvider.Users)))

       {

       userProviderName = p.Name;

              break;

       }

}

//get the role provider name

foreach (RoleProvider rp in System.Web.Security.Roles.Providers)

{

if (rp.GetType().Equals(typeof(Microsoft.SE.AnonProvider.Roles)))

       {

       roleProviderName = rp.Name;

              break;

       }

}

 

자, 이제 제 공급자 이름을 확인했으니 다음에는 사용자 이름과 암호를 사용하고 SecurityToken을 되찾아야 합니다. 이를 위해 SPSecurityContext 클래스를 사용하겠습니다. 여기에는 이 양식 기반 인증 로그인을 자동으로 수행하도록 디자인된 메서드가 포함되어 있습니다. 실행에 성공하면 SecurityToken이 반환되고 그렇지 않으면 null이 반환됩니다. 다음은 이 클래스가 사용자 자격 증명을 인증할 때 사용되는 형태입니다.

SecurityToken tk = SPSecurityContext.SecurityTokenForFormsAuthentication(

new Uri(SPContext.Current.Web.Url), userProviderName, roleProviderName,

          UserNameTxt.Text, PasswordTxt.Text);

 

이런 식으로 인증하려는 사이트에 대해 URI를 전달하고 제 멤버 자격 및 역할 공급자 이름을 알려 주었으며 제 로그인 페이지의 텍스트 상자에 입력된 사용자 이름과 암호 값을 전달했습니다. 이제 SecurityToken이 null이 아닌지 확인한 다음 null이 아닌 경우 세션 토큰을 작성해야 합니다. 이때 SPFederationAuthenticationModule을 사용하면 됩니다. 세션 토큰을 작성한 후에는 작업을 계속 진행하면서 사용자가 어떤 페이지 또는 리소스를 요청하든 바로 리디렉션되도록 할 수 있습니다. 다음은 이 작업을 수행하는 코드의 나머지 부분입니다.

if (tk != null)

{

//try setting the authentication cookie

SPFederationAuthenticationModule fam = SPFederationAuthenticationModule.Current;

fam.SetPrincipalAndWriteSessionToken(tk);

       //look for the Source query string parameter and use that as the redirection

       string src = Request.QueryString["Source"];

       if (!string.IsNullOrEmpty(src))

       Response.Redirect(src);

}

else

{

StatusLbl.Text = "The credentials weren't valid or didn't work or something.";

}

 

이제 모든 작업을 성공적으로 수행한 것을 확인했으므로 사용자가 처음에 대상으로 지정한 위치를 알려 주는 원본 쿼리 문자열 매개 변수만 확보하면 됩니다. 매개 변수를 확보한 후에는 이를 해당 경로로 전송하기만 하면 끝입니다.

모쪼록 이 게시물이 작업에 도움이 되었으면 하는 바람입니다. 실제로 찾아보니 이를 위한 최선의 방법을 다룬 문서를 찾기가 정말 어렵다는 사실을 잘 알게 되었습니다. 2부에서는 이 작업을 다른 시나리오에서 상이한 방법으로 수행해 보도록 하겠습니다. 2부에서는 누군가가 사이트를 처음 사용하기 전에 “이 웹 사이트의 사용 조건에 동의함” 같은 항목을 수락하도록 할 것입니다. 이를 위해 기본 로그인 페이지를 확장하고 로그인 시 처리기를 추가하는 방법을 살펴보겠습니다.

이 문서는 번역된 블로그 게시물입니다. 원본 문서는 SharePoint 2010의 사용자 지정 양식 로그인 페이지 작성: 1부를 참조하십시오.