• 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 FilesCommon FilesMicrosoft SharedWeb Server Extensions15 emplatelayouts)。
    • 接着,为了阻止母版页对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=" 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。还有一些注意点,也把我纠结很久,详见我的附件。点击下载

  • 相关阅读:
    WCF学习笔记之宿主在IIS中
    WCF学习笔记之配置文件
    WCF学习笔记之自托管
    深入C#中的事件
    深入理解c#中的const 和readonly的区别滴呀;
    鼠标跟着键盘飞=====兼容代码
    offset系列,scroll系列
    无缝链接轮播图
    完整轮播图
    location对象
  • 原文地址:https://www.cnblogs.com/OceanEyes/p/how-to-create-custom-sign-in-page.html
Copyright © 2020-2023  润新知