略過 SharePoint 2010 中的多個驗證提供者選擇頁面
英文原文已於 2011 年 5 月 1 日星期日發佈
附註說明: 還不算對執行這個網站的人們建立另一項名聲。這個最新版本現在從 Word 和 Visual Studio 保留下來的格式甚至比以往還「少」!我不認為那會使這個網站變得比原先更糟糕,但您已經感到心煩意亂,我敢說您其實嚇壞了吧,這倒符合我所預期的。還是恭喜!我希望自己也能很快跟上,將 Word、Excel 和 PowerPoint 用於筆記,不管怎樣,誰還需要格式?
我最近需要略過啟用 SharePoint 2010 單一區域上的多個驗證提供者時出現的提供者選擇頁面。我所經歷的案例相當簡單,就是我在區域上啟用了 Windows 驗證和表單型驗證 (FBA)。不過,在這個特殊案例中,我一直想要將使用者重新導向為使用 FBA。
若要完成這項操作,依照下列步驟執行其實相當簡單:
- 備份 default.aspx,位於 C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN 資料夾。
- 開啟 Visual Studio 並建立新的 Windows Class Library 專案。
- 加入 System.Web、Microsoft.SharePoint.dll 和 Microsoft.SharePoint.IdentityModel.dll 的參考。不過,在 GAC 中只找到識別模式組件,所以,我必須將組件複製並放到我的磁碟根目錄,才能加入我的參考。如需有關如何尋找並複製組件的建議,您可以檢閱我的一篇說明如何取得組件的文章:https://blogs.msdn.com/b/sharepoint_cht/archive/2010/11/26/writing-a-custom-forms-login-page-for-sharepoint-2010-part-1.aspx。
- 以強式命名方式命名組件,因為組件將移到 GAC 中。
- 在您的專案中加入新的 ASPX 頁面。其實,我發現最簡單的方式,就是從現有的 ASP.NET Web 應用程式專案複製頁面,因為這個方式可以一次複製全部 .aspx、.aspx.cs 和 .aspx. designer. cs 檔案。在這個情形中,請記住我們要的是一個名為 “default.aspx” 的檔案,而且檔案內如果還沒有任何程式碼且頁面中只有最少的標記,會讓事情容易許多。
- 在程式碼後置 (.aspx.cs 檔案) 中,將命名空間變更為符合目前專案的命名空間。
- 將類別變更為繼承自 Microsoft.SharePoint.IdentityModel.Pages.MultiLogonPage。
- 覆寫 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);
}
}
- 現在編譯應用程式,如此,您就可以為應用程式取得強式名稱,並將應用程式加入 default.aspx 的標記。
- 將下列程式碼貼到 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>
- 在 GAC 註冊您的組件。
- 將新的自訂 default.aspx 頁面複製到 C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN 資料夾。再一次地,請在執行這個操作之前先備份原始的頁面!
- 在伺服陣列的每個 Web 前端上執行步驟 1、11 和 12。
就是這麼簡單。我曾用標準使用者登入進行測試,也直接從 Microsoft Office 2010 用戶端開啟文件測試過。這裡還有一件事要特別注意:這會變更「您的伺服陣列中所有 Web 應用程式」的行為!再一次,這就是為什麼它是個簡單的範例。不過,您可以輕鬆地查看要求的主機名稱 (對應至您的 Web 應用程式),並根據要存取的 Web 應用程式或甚至是網站集合來選擇不同的驗證方式。您也可以輕易地根據手邊有關目前使用者的資訊制定其他決策。HttpRequest.Context.Current、Page.Request 和 Page.Response 類別都可以提供您許多資訊,以便制定各種決策。
這是翻譯後的部落格文章。英文原文請參閱 Bypassing the Multi Authentication Provider Selection Page in SharePoint 2010