SharePoint 2013混合模式登陸中 使用 自定義登陸頁


接前一篇博客《SharePoint 2013自定義Providers在基於表單的身份驗證(Forms-Based-Authentication)中的應用》,當實現混合模式登陸后,接着我們就應該自定義SignIn Page。因為默認的登陸頁面實在是太丑了。

回顧

當為SharePoint 2013 WebApplication配置了以混合模式(FBA Authentication和Windows Authentication)登陸后,我們當然可以自定義登陸頁面(Sign in Page)。登陸SharePoint 2013 Central Administratio后,找到對應的WebApplication,指定其Sign in Page Url即可,如下所示:

創建自定義登陸頁面

  • 首先,為了創建自定義的登陸頁,我選擇了Application Page,默認將被部署在layouts並和項目名稱相同的文件夾中(C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\template\layouts)。
  • 接着,為了阻止母版頁對Application Page的影響,故須去掉母版頁的引用,即 DynamicMasterPageFile="~masterurl/default.master"
  • 由於去掉了對母版頁的引用,故用於"填坑"控件〈asp:Content/>控件也用不着了,所以整個Application Page將被重新設計。
  • 基於表單驗證(FBA )的登陸控件選擇了ASP.NET Login控件,設置其相關屬性即可。以常見的屬性為例:
  • FailureText:登陸失敗時提示的消息
  • MembershipProvider:自定義的Membership Provider,需要繼承MembershipProvider,詳見《SharePoint 2013自定義Providers在基於表單的身份驗證(Forms-Based-Authentication)中的應用
  • DisplayRememberMe:Bool類型,表示是否顯示記住我
  • RememberMeSet:表示是否向用戶瀏覽器發送持久化已認證的Cookie,默認是False
  • TextLayout:有2種選擇,TextOnLeft(Label在TextBox左),TextOnTop(Label在TextBox上)
  • UserNameLabelText:用戶名Label顯示文字
  • PasswordLabelText:密碼Label顯示文字
  • LoginButtonType:有3種選擇,Image ,Button,Image
  • LoginButtonImageUrl:若LoginButtonType選擇了Image,此屬性表示Image地址
  •  完整的Login Control代碼如下所示:
<asp:Login 
                ID="signInControl"
                style="width: 250px" 
                FailureText="用戶名或密碼錯誤" 
                MembershipProvider="CustomFBA_Membership"
                runat="server" 
                DisplayRememberMe="true" 
                TextBoxStyle-Width="250px"
                RememberMeSet="true" 
                UserNameLabelText="用戶名" 
                TextLayout="TextOnLeft"
                PasswordLabelText="密碼" 
                LabelStyle-Font-Bold="false"
                LabelStyle-Font-Size="Large"
                LabelStyle-ForeColor="red"
                LabelStyle-Font-Names="宋體"
                CheckBoxStyle-Font-Bold="false" 
                CheckBoxStyle-Font-Names="宋體"
                CheckBoxStyle-ForeColor="White"
                CheckBoxStyle-Font-Size="Large"
                FailureTextStyle-Wrap="true"
                FailureTextStyle-Font-Names="宋體" 
                FailureTextStyle-Font-Size="Small"
                LoginButtonStyle-Font-Names="宋體"
                LoginButtonStyle-Font-Size="Large"
                LoginButtonImageUrl="/_layouts/images/loginbtn.png" 
                LoginButtonType="Image"
                TitleText="登陸" 
                TitleTextStyle-ForeColor="green" 
                TitleTextStyle-Font-Bold="true" 
                TitleTextStyle-Wrap="true" 
                TitleTextStyle-Font-Names="宋體"
                TitleTextStyle-Font-Size="Larger" />

 

到目前為止基於表單的身份驗證登錄已經設計好了,但是別忘了,我么還需要Windows身份驗證(也就是Acrive Directory Login)的登陸實現。

  • 添加超鏈接,以實現Windows 身份驗證登陸
<asp:LinkButton ID="lbInternalUsers" Text="Active Directory Login" runat="server" Font-Names="宋體" Font-Size="Small" CssClass="ms-standardheader ms-inputformheader" Font-Bold="true" ForeColor="Wheat" OnClick="lbInternalUsers_OnClick" />
  • 在其Click事件中實現以域賬號登陸 
     protected void lbInternalUsers_OnClick(object sender, EventArgs e)
         {
             try
             {
                 if (null != SPContext.Current && null != SPContext.Current.Site)
                 {
                     SPIisSettings iisSettings = SPContext.Current.Site.WebApplication.IisSettings[SPUrlZone.Default];
                     if (null != iisSettings && iisSettings.UseWindowsClaimsAuthenticationProvider)
                     {
                         SPAuthenticationProvider provider = iisSettings.WindowsClaimsAuthenticationProvider;
                         Redirect(provider);
                     }
                 }
            }
             catch (Exception ex)
             {
        
             }
         }
         private void Redirect(SPAuthenticationProvider provider)
         {
             string comp = HttpContext.Current.Request.Url.GetComponents(UriComponents.Query, UriFormat.SafeUnescaped);
             string url = provider.AuthenticationRedirectionUrl.ToString();
             if (provider is SPWindowsAuthenticationProvider)
             {
             comp = EnsureUrl(comp, true);
             }
 
             SPUtility.Redirect(url, SPRedirectFlags.Default, this.Context, comp);
         }
        //http://skyrim:6050/_windows/default.aspx?ReturnUrl=
         private string EnsureUrl(string url, bool urlIsQueryStringOnly)
         {
                if (!url.Contains("ReturnUrl="))
                {
                    if (urlIsQueryStringOnly)
                    {
                    url = url + (string.IsNullOrEmpty(url) ? "" : "&");
                    }
                    else
                    {
                    url = url + ((url.IndexOf('?') == -1) ? "?" : "&");
                    }
                    url = url + "ReturnUrl=";
                }
                return url;
         }

修改默認Sign In Page

  • 當自定義的Sign In Page完成后,給WebApplicatio指定其URL即可,如下所示:

  • 測試基於表單的身份驗證登陸,以驗證其是否正常工作,登陸成功后向客戶端發送名為FedAuth的Cookie

  • 測試基於Windows的身份驗證登陸,以驗證其是否正常工作

總結

對於自定義的ASP.NET Login控件的名稱,注意其名字必須是:signInControl,我在次糾結了很久(異常信息,登陸成功后仍然顯示身份驗證無效,重定向至:/Authenticate.aspx?Source=%2F ,並向客戶端發送名為ASPXAUTH 的 Cookie,當客戶端瀏覽器記住這個錯誤的ASPXAUTH  Cookie后,下一次訪問,返回 500 內部錯誤。清理掉此Cookie后,又恢復正常)。暫時沒有時間去Reflect Sharepoint原始的Login 控件,我估計這個默認的Login控件的名字也是:signInControl。還有一些注意點,也把我糾結很久,詳見我的附件。點擊下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM