声明演练:使用 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 应用程序
浏览到"SharePoint 2010 管理中心"页。
在"应用程序管理"部分,单击"管理 Web 应用程序"。
在功能区上,单击"新建"。
在"新建 Web 应用程序"对话框中的"身份验证"下,单击"基于声明的身份验证"。
在"IIS 网站"部分的"新建 IIS 网站"下,将"名称"字段更改为"SharePoint – SQL FBA"。
将"端口"号更改为 200。
在"声明身份验证类型"部分,执行以下操作:
选择"启用基于表单的身份验证(FBA)"。
清除其他验证模式。
在成员资格提供程序和角色管理器字段中,输入以下名称:
ASP.NET 成员资格提供程序名称:aspnetmembership
ASP.NET 角色管理器名称:aspnetrolemanager
备注
我们尚未设置成员资格和角色提供程序;我们将在随后的步骤中创建它们。
将 URL 更改为:http://intranet.contoso.com:200。
在"数据库名称和验证"部分,将数据库名称更改为 WSS_Content_200。
将其他设置保留为默认值。
单击"确定"以创建 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 成员资格和角色提供程序
启动 Microsoft SQL Server Management Studio 并连接到本地服务器实例。
添加名为 aspnetdb_claim 的新数据库,如图 1 所示。
图 1. 创建名为 aspnetdb_claim 的新数据库
使用 aspnet_regsql.exe 创建成员资格数据库。打开命令提示符窗口。运行以下命令行命令以将目录更改为 Microsoft .NET Framework 2.0 目录。
cd C:\Windows\Microsoft.NET\Framework64\v2.0.50727
运行以下命令,如图 2 所示。
aspnet_regsql -S DEMO2010A -E -A mr –d aspnetdb_claim
-S 指定服务器。在本示例中,为本地服务器。
-E 指定应使用 Windows 身份验证连接到 SQL Server。
-A mr 指定应添加成员资格和角色功能。
-d 指定数据库名称。
图 2. 使用 aspnet_regsql.exe 创建成员资格数据库
展开 aspnetdb_claim 节点并验证是否已创建所有表。
图 3. 展开的 aspnetdb_claim 节点
向 Web 应用程序 AppPool 帐户授予数据库访问权限。由于 Web 应用程序使用 contoso\adminstrator 进行登录,因此它应自动具有对此数据库的完全访问权限。
步骤 3:为 SharePoint Web 应用程序配置成员资格和角色提供程序
必须修改以下 3 个 web.config 文件:
管理中心:以允许选择网站集。
安全令牌服务:以允许登录,以及允许发出令牌。
FBA Web 应用程序:以允许选择本地 Web 应用程序。
为 SharePoint Web 应用程序配置成员资格和角色提供程序
在 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>
对"管理中心"网站和"SecurityTokenServiceApplication"网站重复上面的步骤。
"SecurityTokenServiceApplication"网站位于"SharePoint Web 服务"网站下,如图 4 所示。
图 4. SecurityTokenServiceApplication 网站位置
返回到基于表单的身份验证 Web 应用程序网站 (http://intranet.contoso.com:200),并重新打开 web.config 文件。
在 <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 文件中的提供程序值
将以下角色管理器元素添加到 <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 成员资格和角色提供程序使用该名称来唯一标识用户。
对管理中心网站和 SecurityTokenServiceApplication 网站重复该过程中的步骤 1 至步骤 5。
备注
由于 SharePoint 安全令牌服务 (STS) 网站的 web.config 文件不包含 <system.web> 部分,因此必须手动添加该部分。(SecurityTokenServiceApplication 网站位于 SharePoint Web 服务网站下,如图 4 所示。)若要查看完成的 web.config 文件的示例,请打开本文附带的下载 (ClaimsExample-CreateFormsBasedAuthentication(该链接可能指向英文页面)) 中包含的配置文件。
步骤 4:将用户和角色添加到成员资格和角色提供程序数据库中
接下来,将用户和角色添加到成员资格和角色提供程序数据库中。
将用户和角色添加到成员资格和角色提供程序数据库中
启动 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 数据库
运行以下查询以将用户 admin1 添加到 Admin 角色中,如图 8 所示。
EXEC aspnet_Roles_CreateRole 'MyAppName', 'Admin' EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'admin1', 'Admin', 8
图 8. 向 Admin 角色中添加用户 admin1
步骤 5:测试基于表单的身份验证
接下来,测试基于表单的身份验证。
测试基于表单的身份验证
在"管理中心"网站上的"应用程序管理"下,单击"创建网站集"。
在"Web 应用程序"下拉列表中,选择 FBA Web 应用程序 **http://intranet.contoso.com:200**(参见图 9)。
图 9. 配置 Web 应用程序
在"标题"字段中,将该值更改为"FBA 网站"。
在"用户名"字段中,单击"浏览",然后查找我们所添加的用户。
在搜索框中键入 admin1,然后单击搜索按钮,如图 10 所示。
图 10. 人员选取器
在结果区域双击 admin1 用户。这样,您就会返回到网站集创建页面。
单击"确定"以创建网站集。
导航到 **http://intranet.contoso.com:200**。您应看到登录页,如图 11 所示。
图 11. 登录页
键入以下凭据,然后单击"登录"。
用户名:admin1
密码:pass@word1
登录后,请注意右上角显示的用户名为 admin1,如图 12 所示。
图 12. 验证用户 admin1 之后的 SharePoint 网站
步骤 6:(可选)处理配置和未处理异常错误
图 13 显示当在 web.config 文件中输入错误配置时将出现的错误。请记住,必须编辑所有 SharePoint 过程的所有 web.config 文件。本文附带的下载包含 3 个 web.config 文件,可供您参考。图 14 显示未处理的异常错误。
图 13. 成员资格提供程序配置错误
图 14. 未处理的异常错误
如果遇到未处理的异常错误,则必须将 includeExceptionDetailInFaults 值添加到 <serviceBehaviors> 部分,如图 15 所示。
图 15. 在 <serviceBehaviors> 部分添加 includeExceptionDetailInFaults
步骤 7:查看声明
接下来,查看声明。
查看声明
创建 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); } }
部署解决方案并将 Web 部件添加到 FBA 网站 Web 应用程序的主页中(参见图 16)。
图 16. 声明类型和声明值信息
注意以下两个声明。
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:添加更多用户和角色
接下来步,添加其他用户和角色。
添加更多用户和角色
运行以下 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
在功能区上的"网站操作"下,选择"网站权限",然后单击"授予权限"。单击"浏览"图标以打开"人员选取器"对话框。确保仍以 admin1 身份登录。
选择"表单身份验证",如图 17 所示。
图 17. 显示搜索结果的人员选取器
在搜索框中键入 bob(如图 17 所示),然后单击"搜索"。应返回一条记录。
双击"bob"以将其添加到"添加->"框中。
单击"确定"。
重复步骤 4 至步骤 6 以添加用户 mary。
从下拉框中选择"FBA 网站成员",如图 18 所示。
图 18. 向用户授予权限
单击"确定"。
在功能区上单击"授予权限"。
单击"浏览"以启动人员选取器。
再次选择左侧的"表单身份验证",如前面的图 17 所示。
在搜索框中键入 ceo。应返回一条记录,如图 19 所示。
备注
在本文中的示例中,ceo 是 ASP.NET 角色提供程序的角色。我们在步骤 8 开始时使用 SQL 查询添加了该角色。
图 19. 搜索名为 ceo 的角色
双击 ceo 以将其添加到"授予权限"页面中。
为 ceo 角色授予完全控制权限,如图 20 所示。
图 20. 为 ceo 授予完全控制权限
单击页面右上角的 admin1,然后选择"以其他用户身份登录",如图 21 所示。
图 21. 以其他用户身份登录
尝试以 bob 用户的身份登录网站,然后以 mary 用户的身份登录。注意 Web 部件从角色提供程序显示正确的角色声明。
尝试以 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 应用程序创建基于表单的身份验证。
其他资源
有关详细信息,请参阅以下资源: