Partager via


为 SharePoint 2010 编写自定义表单登录页(第 1 部分)

为 SharePoint 2010 编写自定义表单登录页(第 1 部分)

在 SharePoint 2007 中,为基于表单的身份验证 (FBA) 网站编写自定义登录页不太难。 需要了解一些事情,其中大多数不是特定于 SharePoint 的,还有一些让登录表单采用标准 SharePoint 布局页的外观的提示。 但大体说来,如果您了解 ASP.NET 和 FormsAuthentication 类,就可以轻松进行。 但不幸地是,在 SharePoint 2010 中,事情变得有点复杂。

在本文中,我们将演练一个自定义登录页方案。 在本示例中,我们决定需要一个完全自定义的登录页,不仅要更改外观,还需要完全不同的 UI。 例如,我们可能需要获取用于登录的成员资格凭据,然后我们可能需要某人输入辅助身份验证 ID,例如您可能具有 SecurID。 在该情况下,我们将在 ASP.NET 页面上有两个分别针对用户名和密码的文本框,我们将需要获取这些并以编程方式使用户登录。

在这里需要记住的最重要的一点是,将不再使用您的老朋友 FormsAuthentication 类。 原因是在 SharePoint 2010 中,FBA 用户实际上是声明用户。 所以虽然您可能认为您使用的是标准 ASP.NET 成员资格用户和角色提供程序,但实际上这些对象具有卓越的声明身份验证外壳。 因此,我们需要使用一些 SharePoint 声明类来完成 FBA 登录过程。

我需要在这里添加一段说明! 通常,通过一种方式或另一种方式,我在博客上发布内容之前,已知道或已尽力向知道的某人确认,这是正确的/成功的/受支持的做某事的方式。 在本例中,我尝试反复检查此方法,但无法这样做。 我将此代码用于我所从事的项目,并且它确实运行良好,但我不想某人在代码报警稍后告诉您需要修改它以符合某种其他更好/更适当的做事情方式时停止心跳。 已够自我保护了,让我们查看一些代码。

在我们开始之前,将需要两个引用,您可能以前没有使用过它们。 第一个是 Microsoft.SharePoint.Security.dll,它在 ISAPI 文件夹中的 14 配置单元中。 另一个比较棘手,它是我进行上述说明的主要原因。 您需要对 Microsoft.SharePoint.IdentityModel.dll 的引用。 不过,如果您要添加引用,您将无法轻松找到此程序集,从而使我的源变得稍微麻烦一点,同时需要谨慎一点。 正如我在另一篇文章中所介绍的,我发现要做的最佳事情是在文件系统上找到它,将它复制到易于找到的位置,然后添加对复制的版本的引用。 我执行该操作通常采取的方法(我猜测这是我成为守旧派的原因)是转到命令提示符,切换到驱动器的根,然后执行“dir Microsoft.SharePoint.IdentityModel.dll /s”,并以该方式找到它。 在您具有它后,您可能希望添加一小组 using 语句:

using System.Web.Security;

using System.IdentityModel.Tokens;

using Microsoft.SharePoint;

using Microsoft.SharePoint.IdentityModel;

因此,现在我们清除了那点麻烦,当我调用声明类以验证用户键入的 FBA 用户凭据时,我需要告诉它应使用哪个成员资格和角色提供程序。 它只需要一个名称。 在我的特定情况下,我为要执行的操作编写了一个自定义成员资格和角色提供程序,因此我只枚举我的 Web 应用程序知道的所有提供程序,直到找到我的提供程序:

//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.角色.Providers)

{

if (rp.GetType().Equals(typeof(Microsoft.SE.AnonProvider.角色)))

       {

       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 非空,否则我需要编写会话标记。 这是通过 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.";

}

 

现在,您看到当我成功完成所有代码后,我只获取 Source 查询字符串参数,因为它告诉我们用户最初转到哪里。 在我具有了它后,我会发送他们。

希望这可帮助您开始。 我知道在查找时,找到有关如何以最佳方式执行此操作的文档确实费劲。 在第 2 部分,我们将了解如何以不同方式为另一个方案执行此操作。 在其中,我们将需要让某人在首次使用网站之前签署“我同意此网站的使用条款”事项。 为此,我们将了解如何扩展基本登录页并在登录时添加一个处理程序。

这是一篇本地化的博客文章。请访问 Writing A Custom Forms Login Page for SharePoint 2010 Part 1 以查看原文