Partager via


SharePoint 2010에서 다중 인증 공급자 선택 페이지 무시

 

최초 문서 게시일: 2011년 5월 1일 일요일

시작하기 전에:   먼저 이 사이트 운영자들에게 다시 한 번 감사의 뜻을 전합니다. 최신 사이트 버전에서는 Word 및 Visual Studio의 서식 기능이 이전보다 더 줄어들었네요. 개인적으로는 절대 불가능할 거라고 생각했는데 이번에도 저의 예상을 여지없이 뒤엎으셨군요. 축하 드립니다. 저도 조만간 Word, Excel, PowerPoint 같은 프로그램 대신 메모장만 사용하고 싶네요. 솔직히 서식은 그다지 중요한 것이 아니잖아요?

최근에 SharePoint 2010의 단일 영역에서 여러 인증 공급자를 사용하도록 설정할 때 표시되는 공급자 선택 페이지를 무시해야 하는 경우가 있었습니다. 제 경우에는 시나리오가 꽤 단순했지만, 훨씬 복잡한 시나리오를 지원하도록 해당 방법을 확장할 수도 있습니다. 제가 사용한 시나리오에서는 영역에 대해 Windows 인증과 FBA(양식 기반 인증)이 사용하도록 설정되어 있었습니다. 그러나 이 시나리오에서는 사용자가 항상 FBA를 사용하도록 리디렉션하고자 했습니다.

이 작업은 다음 단계를 통해 비교적 간단하게 수행할 수 있었습니다.

  1. C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN 폴더에 default.aspx백업 복사본을 만듭니다.
  2. Visual Studio를 열고 새 Windows 클래스 라이브러리 프로젝트를 만듭니다.
  3. System.Web, Microsoft.SharePoint.dll 및 Microsoft.SharePoint.IdentityModel.dll에 대한 참조를 추가합니다. ID 모델 어셈블리는 GAC에만 있으므로 어셈블리를 복사하여 드라이브 루트에 저장하는 방법으로 참조를 추가해야 했습니다. 이 어셈블리를 찾아 복사하는 방법에 대한 권장 사항은 해당 방법을 설명하는 저의 게시물인 https://blogs.msdn.com/b/sharepoint_ko/archive/2010/11/17/sharepoint-2010-1.aspx에서 확인할 수 있습니다. 
  4. 어셈블리는 GAC에 포함되므로 강력한 이름을 지정합니다.
  5. 프로젝트에 새 ASPX 페이지를 추가합니다. 솔직히 이 작업을 수행하는 가장 쉬운 방법은 기존 ASP.NET 웹 응용 프로그램 프로젝트에서 페이지를 복사하는 것입니다. 이렇게 하면 .aspx, .aspx.cs 그리고 .aspx.designer.cs 파일을 모두 한꺼번에 복사할 수 있습니다. 여기서는 파일 이름을 "default.aspx"로 지정합니다. 아직 작성한 코드가 없으며 페이지에 최소한의 태그만 포함되어 있으면 작업이 더욱 쉬워집니다.
  6. 코드 숨김 파일(.aspx.cs 파일)에서 현재 프로젝트의 네임스페이스와 일치하도록 네임스페이스를 변경합니다.
  7. Microsoft.SharePoint.IdentityModel.Pages.MultiLogonPage에서 상속하도록 클래스를 변경합니다.
  8. OnLoad 이벤트를 재정의합니다. 사용자가 여러 인증 공급자를 사용하도록 설정된 페이지를 방문하면 먼저 /_login/default.aspx 페이지(위의 1단계에서 설명한 페이지)로 이동합니다. 이 페이지에서 사용자는 사용할 인증 공급자를 선택하며, 그러면 적절한 인증 페이지로 리디렉션됩니다. 앞에서 설명한 것처럼, 이 시나리오에서는 항상 사용자가 FBA를 사용하여 인증하도록 할 것이므로 사용자를 항상 /_forms/default.aspx로 리디렉션합니다. 정상적인 로그인을 단계별로 수행하는 경우에는 /_login/default.aspx 페이지로 리디렉션되어 항목을 선택한 다음 /_login/default.aspx로 포스트백되며, 여기서 올바른 로그인 페이지로 리디렉션됩니다. 따라서 저는 로그인 페이지가 포스트백되는지만을 확인했습니다. 페이지가 포스트백되지 않는 경우에는 인증 공급자를 아직 선택하지 않은 것입니다. 그래서 저는 모든 쿼리 문자열 값을 열거하여 /_forms/default.aspx에 추가한 다음 사용자가 이 페이지로 리디렉션되도록 했습니다. 제가 사용한 전체 코드 조각은 다음과 같습니다.

protected override void OnLoad(EventArgs e)

{

   base.OnLoad(e);

 

   try

   {

       //if this isn't a postback, then the user hasn't selected which

       //auth provider they want to use

       //in this case we want to always refer the person to forms login

       if (!this.IsPostBack)

       {

          //grab all the query string parameters

          System.Text.StringBuilder qp = new System.Text.StringBuilder(2048);

 

          foreach (string key in this.Request.QueryString.Keys)

          {

             qp.Append(key + "=" + this.Request.QueryString[key] + "&");

          }

 

          //redirect to the forms login page

          this.Response.Redirect("/_forms/default.aspx?" + qp.ToString());

       }

   }

   catch (Exception ex)

   {

       Debug.WriteLine(ex.Message);

   }

}

  1. 이제 응용 프로그램에 대해 강력한 이름을 지정하고 응용 프로그램을 default.aspx의 태그에 추가할 수 있도록 응용 프로그램을 컴파일합니다.
  2. default.aspx에 다음 코드를 붙여 넣습니다. 페이지가 상속하는 클래스만 변경하면 됩니다(아래에 강조 표시되어 있음). 제가 수행한 작업은 /_login/default.aspx에서 코드를 복사한 다음 상속 값을 사용자 지정 클래스 정보로 바꾼 것뿐이었습니다.

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" Inherits="MultiAuthLoginPage._Default,MultiAuthLoginPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=907bf41ebba93579" MasterPageFile="~/_layouts/simple.master" %>

<%@ Assembly Name="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Register Tagprefix="SharepointIdentity" Namespace="Microsoft.SharePoint.IdentityModel" Assembly="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>

<%@ Import Namespace="Microsoft.SharePoint.WebControls" %>

<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Import Namespace="Microsoft.SharePoint" %>

<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<asp:Content ID="Content1" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">

                <SharePoint:EncodedLiteral runat="server"  EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitle" />

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderId="PlaceHolderPageTitleInTitleArea" runat="server">

                <SharePoint:EncodedLiteral runat="server"  EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitleInTitleArea" />

</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderId="PlaceHolderSiteName" runat="server"/>

<asp:Content ID="Content4" ContentPlaceHolderId="PlaceHolderMain" runat="server">

<SharePoint:EncodedLiteral runat="server"  EncodeMethod="HtmlEncode" Id="ClaimsLogonPageMessage" />

<br />

<br />

<SharepointIdentity:LogonSelector ID="ClaimsLogonSelector" runat="server" />

</asp:Content> 

  1. 어셈블리를 GAC에 등록합니다.
  2. 새 사용자 지정 default.aspx 페이지를 C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN 폴더에 복사합니다. 여기서도 페이지를 복사하기 전에 원본의 백업을 만들어 두십시오.
  3. 팜의 모든 웹 프런트 엔드에 대해 1, 11, 12단계를 수행합니다.

이제 작업이 완료되었습니다. 표준 사용자 로그인은 물론, Microsoft Office 2010 클라이언트에서 문서를 직접 열 때도 이 코드를 테스트해 보았습니다. 마지막으로 한 가지만 더 짚고 넘어가겠습니다. 이 작업을 수행하면 팜에 있는 모든 웹 응용 프로그램의 동작이 변경됩니다. 따라서 이 예제는 앞서 언급한 것처럼 단순하다고 할 수 있습니다. 그러나 웹 응용 프로그램에 매핑되는 요청의 호스트 이름을 쉽게 확인하여 액세스 중인 웹 응용 프로그램 또는 사이트 모음에 따라 다른 인증 방법을 사용하도록 결정할 수 있습니다. 또한 현재 사용자에 대한 정보를 기반으로 다른 사항도 결정할 수 있습니다. HttpRequest.Context.Current, Page.Request 및 Page.Response 클래스는 이러한 유형의 결정을 내리는 데 필요한 다양한 정보를 제공할 수 있습니다.

 

이 문서는 번역된 블로그 게시물입니다. 원본 문서는 Bypassing the Multi Authentication Provider Selection Page in SharePoint 2010을 참조하십시오.