声明演练:使用 ASP.NET SQL 成员资格和角色提供程序为基于声明的 SharePoint 2010 Web 应用程序创建基于表单的身份验证

**摘要:**了解如何使用 ASP.NET SQL 成员资格和角色提供程序为基于声明的 Web 应用程序创建基于表单的身份验证。

上次修改时间: 2013年1月18日

适用范围: Business Connectivity Services | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

本文内容
概述如何使用 ASP.NET SQL 成员资格和角色提供程序验证基于声明的 Web 应用程序
步骤 1:创建 SharePoint Web 应用程序
步骤 2:准备数据库以对 Web 应用程序使用 ASP.NET 成员资格和角色提供程序
步骤 3:为 SharePoint Web 应用程序配置成员资格和角色提供程序
步骤 4:将用户和角色添加到成员资格和角色提供程序数据库中
步骤 5:测试基于表单的身份验证
步骤 6:(可选)处理配置和未处理异常错误
步骤 7:查看声明
步骤 8:添加更多用户和角色
结论
其他资源

**供稿人:**Andy Li,Microsoft Corporation

目录

  • 概述如何使用 ASP.NET SQL 成员资格和角色提供程序验证基于声明的 Web 应用程序

  • 步骤 1:创建 SharePoint Web 应用程序

  • 步骤 2:准备数据库以对 Web 应用程序使用 ASP.NET 成员资格和角色提供程序

  • 步骤 3:为 SharePoint Web 应用程序配置成员资格和角色提供程序

  • 步骤 4:将用户和角色添加到成员资格和角色提供程序数据库中

  • 步骤 5:测试基于表单的身份验证

  • 步骤 6:(可选)处理配置和未处理异常错误

  • 步骤 7:查看声明

  • 步骤 8:添加更多用户和角色

  • 结论

  • 其他资源

单击以获取代码下载代码:ClaimsExample-CreateFormsBasedAuthentication(该链接可能指向英文页面)

概述如何使用 ASP.NET SQL 成员资格和角色提供程序验证基于声明的 Web 应用程序

在本演练中,您将创建基于声明的 Web 应用程序,方法是将 Microsoft ASP.NET 成员资格和角色提供程序用作验证提供程序。

在 Microsoft SharePoint 2010 中,基于表单的身份验证通过实现成员资格提供程序(用于定义可标识和验证各个用户的接口)和角色管理器(用于定义将各个用户分组到逻辑组或角色的接口)来提供自定义标识管理。

本文假定您熟悉基于表单的身份验证。有关基于表单的身份验证的详细信息,请参阅 SharePoint 产品和技术中的表单身份验证(第 1 部分):简介

步骤 1:创建 SharePoint Web 应用程序

备注

如果只是从本文复制命令行命令并尝试运行该命令,则可能会出错。这是因为在设置格式时,一些字符会转换为特殊字符。例如,从本文复制的连字符 (-) 在命令提示符窗口中可能无法正确运行。

创建 SharePoint Web 应用程序

  1. 浏览到"SharePoint 2010 管理中心"页。

  2. 在"应用程序管理"部分,单击"管理 Web 应用程序"。

  3. 在功能区上,单击"新建"。

  4. 在"新建 Web 应用程序"对话框中的"身份验证"下,单击"基于声明的身份验证"。

  5. 在"IIS 网站"部分的"新建 IIS 网站"下,将"名称"字段更改为"SharePoint – SQL FBA"。

  6. 将"端口"号更改为 200。

  7. 在"声明身份验证类型"部分,执行以下操作:

    • 选择"启用基于表单的身份验证(FBA)"。

    • 清除其他验证模式。

  8. 在成员资格提供程序和角色管理器字段中,输入以下名称:

    • ASP.NET 成员资格提供程序名称:aspnetmembership

    • ASP.NET 角色管理器名称:aspnetrolemanager

      备注

      我们尚未设置成员资格和角色提供程序;我们将在随后的步骤中创建它们。

  9. URL 更改为:http://intranet.contoso.com:200。

  10. 在"数据库名称和验证"部分,将数据库名称更改为 WSS_Content_200。

  11. 将其他设置保留为默认值。

  12. 单击"确定"以创建 Web 应用程序。

步骤 2:准备数据库以对 Web 应用程序使用 ASP.NET 成员资格和角色提供程序

在此步骤中,我们将手动为 ASP.NET 成员资格和角色提供程序准备 Microsoft SQL Server 数据库。还提供了配置此数据库的工具。我们将手动完成这些步骤,以便您能够更好地了解配置中涉及的所有提供程序。

备注

Microsoft SQL Server 成员资格提供程序在 SQL Server 数据库中存储用户信息。可通过从命令行运行 Aspnet_regsql.exe 来手动创建 SQL Server 用户存储。或者,也可以在向导模式中运行 Aspnet_regsql.exe(参阅 ASP.NET SQL Server 注册工具 (Aspnet_regsql.exe))或使用 ASP.NET 配置工具。可在 Microsoft Visual Studio 中的"网站"菜单下查找 ASP.NET 配置工具。

准备数据库以对 Web 应用程序使用 ASP.NET 成员资格和角色提供程序

  1. 启动 Microsoft SQL Server Management Studio 并连接到本地服务器实例。

  2. 添加名为 aspnetdb_claim 的新数据库,如图 1 所示。

    图 1. 创建名为 aspnetdb_claim 的新数据库

    创建新数据库

  3. 使用 aspnet_regsql.exe 创建成员资格数据库。打开命令提示符窗口。运行以下命令行命令以将目录更改为 Microsoft .NET Framework 2.0 目录。

    cd C:\Windows\Microsoft.NET\Framework64\v2.0.50727

  4. 运行以下命令,如图 2 所示。

    aspnet_regsql -S DEMO2010A -E -A mr –d aspnetdb_claim

    -S    指定服务器。在本示例中,为本地服务器。

    -E    指定应使用 Windows 身份验证连接到 SQL Server。

    -A mr   指定应添加成员资格和角色功能。

    -d    指定数据库名称。

    图 2. 使用 aspnet_regsql.exe 创建成员资格数据库

    使用 aspnet_regsql.exe 创建成员关系数据库

  5. 展开 aspnetdb_claim 节点并验证是否已创建所有表。

    图 3. 展开的 aspnetdb_claim 节点

    展开的 aspnetdb_claim 节点

  6. 向 Web 应用程序 AppPool 帐户授予数据库访问权限。由于 Web 应用程序使用 contoso\adminstrator 进行登录,因此它应自动具有对此数据库的完全访问权限。

步骤 3:为 SharePoint Web 应用程序配置成员资格和角色提供程序

必须修改以下 3 个 web.config 文件:

  • 管理中心:以允许选择网站集。

  • 安全令牌服务:以允许登录,以及允许发出令牌。

  • FBA Web 应用程序:以允许选择本地 Web 应用程序。

为 SharePoint Web 应用程序配置成员资格和角色提供程序

  1. 在 SQL 基于表单的身份验证 Web 应用程序的 web.config 文件中,在 </configSections> 结束标记后添加以下连接字符串。

    备注

    如果从以下示例粘贴,则可能会添加制表符或空格。修改 web.config 时,请确保不要添加任何制表符或空格。

    添加连接字符串后,web.config 文件应与以下示例类似。

    <connectionStrings>
      <add name="MyLocalSQLServer"
           connectionString="Initial Catalog=aspnetdb_claim;data source=DEMO2010A;Integrated Security=SSPI;" />
    </connectionStrings>
    
  2. 对"管理中心"网站和"SecurityTokenServiceApplication"网站重复上面的步骤。

    "SecurityTokenServiceApplication"网站位于"SharePoint Web 服务"网站下,如图 4 所示。

    图 4. SecurityTokenServiceApplication 网站位置

    SecurityTokenServiceApplication 网站位置

  3. 返回到基于表单的身份验证 Web 应用程序网站 (http://intranet.contoso.com:200),并重新打开 web.config 文件。

  4. 在 <Providers> 标记中添加以下代码,该标记位于 <membership> 标记下(参见图 5)。

      <add name="aspnetmembership" 
                 connectionStringName="MyLocalSQLServer" 
                 applicationName="MyAppName" 
                 type="System.Web.Security.SqlMembershipProvider, 
                 System.Web, Version=2.0.0.0, Culture=neutral, 
                 PublicKeyToken=b03f5f7f11d50a3a" />
    

    图 5. FBA Web 应用程序 web.config 文件中的提供程序值

    提供程序值

  5. 将以下角色管理器元素添加到 <Providers> 标记中,该标记位于 <RoleManager> 部分下(参见图 6)。

            <add name="aspnetrolemanager" 
                 type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                 connectionStringName="MyLocalSQLServer"
                 applicationName="MyAppName" />
    

    图 6. FBA Web 应用程序 web.config 文件中的角色管理器值

    角色管理器值

    备注

    applicationName 属性指定 Web 应用程序的应用程序名称;ASP.NET 成员资格和角色提供程序使用该名称来唯一标识用户。

  6. 管理中心网站和 SecurityTokenServiceApplication 网站重复该过程中的步骤 1 至步骤 5。

    备注

    由于 SharePoint 安全令牌服务 (STS) 网站的 web.config 文件不包含 <system.web> 部分,因此必须手动添加该部分。(SecurityTokenServiceApplication 网站位于 SharePoint Web 服务网站下,如图 4 所示。)若要查看完成的 web.config 文件的示例,请打开本文附带的下载 (ClaimsExample-CreateFormsBasedAuthentication(该链接可能指向英文页面)) 中包含的配置文件。

步骤 4:将用户和角色添加到成员资格和角色提供程序数据库中

接下来,将用户和角色添加到成员资格和角色提供程序数据库中。

将用户和角色添加到成员资格和角色提供程序数据库中

  1. 启动 Microsoft SQL Server Management Studio,并对 aspnetdb_claim 数据库运行以下查询,如图 7 所示。

    declare @now datetime
    set @now= GETDATE()
    exec aspnet_Membership_CreateUser 'MyAppName','admin1','pass@word1',
        '','admin1@contoso.com','','',1,@now,@now,0,0,null
    

    图 7. 查询 aspnetdb_claim 数据库

    查询 aspnetdb_claim 数据库

  2. 运行以下查询以将用户 admin1 添加到 Admin 角色中,如图 8 所示。

    EXEC aspnet_Roles_CreateRole 'MyAppName', 'Admin'
    EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'admin1', 'Admin', 8 
    

    图 8. 向 Admin 角色中添加用户 admin1

    向管理员角色中添加用户 admin1

步骤 5:测试基于表单的身份验证

接下来,测试基于表单的身份验证。

测试基于表单的身份验证

  1. 在"管理中心"网站上的"应用程序管理"下,单击"创建网站集"。

  2. 在"Web 应用程序"下拉列表中,选择 FBA Web 应用程序 **http://intranet.contoso.com:200**(参见图 9)。

    图 9. 配置 Web 应用程序

    配置 Web 应用程序

  3. 在"标题"字段中,将该值更改为"FBA 网站"。

  4. 在"用户名"字段中,单击"浏览",然后查找我们所添加的用户。

  5. 在搜索框中键入 admin1,然后单击搜索按钮,如图 10 所示。

    图 10. 人员选取器

    人员选取器

  6. 在结果区域双击 admin1 用户。这样,您就会返回到网站集创建页面。

  7. 单击"确定"以创建网站集。

  8. 导航到 **http://intranet.contoso.com:200**。您应看到登录页,如图 11 所示。

    图 11. 登录页

    登录页

  9. 键入以下凭据,然后单击"登录"。

    • 用户名:admin1

    • 密码:pass@word1

  10. 登录后,请注意右上角显示的用户名为 admin1,如图 12 所示。

    图 12. 验证用户 admin1 之后的 SharePoint 网站

    用户 admin1 经过身份验证后的 SharePoint 网站

步骤 6:(可选)处理配置和未处理异常错误

图 13 显示当在 web.config 文件中输入错误配置时将出现的错误。请记住,必须编辑所有 SharePoint 过程的所有 web.config 文件。本文附带的下载包含 3 个 web.config 文件,可供您参考。图 14 显示未处理的异常错误。

图 13. 成员资格提供程序配置错误

成员资格提供程序配置错误

图 14. 未处理的异常错误

未经处理的异常错误

如果遇到未处理的异常错误,则必须将 includeExceptionDetailInFaults 值添加到 <serviceBehaviors> 部分,如图 15 所示。

图 15. 在 <serviceBehaviors> 部分添加 includeExceptionDetailInFaults

添加 includeExceptionDetailInFaults 值

步骤 7:查看声明

接下来,查看声明。

查看声明

  1. 创建 Web 部件,并将 RenderContent 函数替换为以下代码。您可能需要添加对 Microsoft.IdentityModel.dll 的引用并添加命名空间 Microsoft.IdentityModel.Claims。

            protected override void RenderContents(HtmlTextWriter writer)
            {
                try
                {
                    IClaimsIdentity currentIdentity = System.Threading.Thread.CurrentPrincipal.Identity as IClaimsIdentity;
                    writer.Write("---Subject:" + currentIdentity.Name + "<BR/>");
    
                    foreach (Claim claim in currentIdentity.Claims)
                    {
                        writer.Write("   ClaimType: " + claim.ClaimType + "<BR/>");
                        writer.Write("   ClaimValue: " + claim.Value + "<BR/");
                        writer.Write("   ClaimValueTypes: " + claim.ValueType + "<BR/>");
                        writer.Write("   Issuer: " + claim.Issuer + "<BR/");
                        writer.Write("   OriginalIssuer: " + claim.OriginalIssuer + "<BR/>");
                        writer.Write("   Properties: " + claim.Properties.Count.ToString() + "<BR/>");
                    }
                }
                catch (Exception ex)
                {
                    writer.Write("exception occurred: " + ex.Message);
                }
    
            }
    
  2. 部署解决方案并将 Web 部件添加到 FBA 网站 Web 应用程序的主页中(参见图 16)。

    图 16. 声明类型和声明值信息

    声明类型和声明值信息

  3. 注意以下两个声明。

    ClaimType: https://schemas.microsoft.com/sharepoint/2009/08/claims/userid
    ClaimValue: 0#.f|aspnetmembership|admin1
    ClaimType: https://schemas.microsoft.com/ws/2008/06/identity/claims/role
    ClaimValue: Admin
    

    角色声明是从 ASP.NET 角色提供程序检索到的。请记住,Admin 是分配给用户的角色的名称;当运行 SQL 查询以添加用户的角色时,该角色为 admin1。

步骤 8:添加更多用户和角色

接下来步,添加其他用户和角色。

添加更多用户和角色

  1. 运行以下 SQL 查询以将更多用户和角色添加到提供程序中。

    declare @now datetime
    set @now= GETDATE()
    
    exec aspnet_Membership_CreateUser 'MyAppName','bob','pass@word1',
        '','bob@contoso.com','','',1,@now,@now,0,0,null
    exec aspnet_Membership_CreateUser 'MyAppName','mary','pass@word1',
        '','mary@contoso.com','','',1,@now,@now,0,0,null
    exec aspnet_Membership_CreateUser 'MyAppName','jack','pass@word1',
    '','jack@contoso.com','','',1,@now,@now,0,0,null
    
    EXEC aspnet_Roles_CreateRole 'MyAppName', 'Employee'
    EXEC aspnet_Roles_CreateRole 'MyAppName', 'TeamManager'
    EXEC aspnet_Roles_CreateRole 'MyAppName', 'CEO'
    
    EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'bob', 'Employee', 8 
    EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'mary', 'TeamManager', 8 
    EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'jack', 'CEO', 8 
    EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'jack', 'Admin', 8 
    
  2. 在功能区上的"网站操作"下,选择"网站权限",然后单击"授予权限"。单击"浏览"图标以打开"人员选取器"对话框。确保仍以 admin1 身份登录。

  3. 选择"表单身份验证",如图 17 所示。

    图 17. 显示搜索结果的人员选取器

    显示搜索结果的人员选取器

  4. 在搜索框中键入 bob(如图 17 所示),然后单击"搜索"。应返回一条记录。

  5. 双击"bob"以将其添加到"添加->"框中。

  6. 单击"确定"。

  7. 重复步骤 4 至步骤 6 以添加用户 mary。

  8. 从下拉框中选择"FBA 网站成员",如图 18 所示。

    图 18. 向用户授予权限

    向用户授予权限

  9. 单击"确定"。

  10. 在功能区上单击"授予权限"。

  11. 单击"浏览"以启动人员选取器。

  12. 再次选择左侧的"表单身份验证",如前面的图 17 所示。

  13. 在搜索框中键入 ceo。应返回一条记录,如图 19 所示。

    备注

    在本文中的示例中,ceo 是 ASP.NET 角色提供程序的角色。我们在步骤 8 开始时使用 SQL 查询添加了该角色。

    图 19. 搜索名为 ceo 的角色

    搜索名为 CEO 的角色

  14. 双击 ceo 以将其添加到"授予权限"页面中。

  15. ceo 角色授予完全控制权限,如图 20 所示。

    图 20. 为 ceo 授予完全控制权限

    授予 CEO 完全控制权限

  16. 单击页面右上角的 admin1,然后选择"以其他用户身份登录",如图 21 所示。

    图 21. 以其他用户身份登录

    作为其他用户登录

    尝试以 bob 用户的身份登录网站,然后以 mary 用户的身份登录。注意 Web 部件从角色提供程序显示正确的角色声明。

  17. 尝试以 jack 身份登录。注意,用户 jack 将获得以下两个声明。

    ClaimType:https://schemas.microsoft.com/ws/2008/06/identity/claims/role

    ClaimValue:Admin

    ClaimType:https://schemas.microsoft.com/ws/2008/06/identity/claims/role

    ClaimValue:ceo

    这两个声明与之前我们在 SQL 查询中为其分配的角色相匹配。请记住,我们为 ceo 角色分配权限,因此只要用户具有 ceo 声明,它就应该能够登录网站并且还具有相应权限。

结论

在本演练中,您了解了如何使用 ASP.NET SQL 成员资格和角色提供程序为基于声明的 Web 应用程序创建基于表单的身份验证。

其他资源

有关详细信息,请参阅以下资源: