65.9K
CodeProject 正在变化。 阅读更多。
Home

自定义成员资格、角色提供程序、网站管理工具以及对单个文件的基于角色的访问

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (11投票s)

2007 年 12 月 28 日

CPOL

5分钟阅读

viewsIcon

161924

downloadIcon

11490

自定义成员资格和角色提供程序、网站管理工具以及对单个文件的基于角色的访问。

Sample Image

引言

我在此提供一个自定义成员资格提供程序和自定义角色提供程序的示例。本文解释了如何使用您自己的简单自定义数据库轻松实现自定义提供程序。

此外,我将提供一个完整的网站管理工具,可以编辑网站设置。它具有创建/编辑/管理用户的功能以及创建/编辑/管理角色的功能。

最后,我将介绍一种对单个文件进行基于角色的访问控制的不同方法。有关多个 ASPX 文件的信息存储在“活动”数据库中。通过网站管理工具,我们可以为单个 ASPX 文件分配基于角色的访问权限。(代码只是为了说明我想表达的观点。我已经测试了提供程序,但“活动”模块尚未经过生产环境测试。我将非常感谢为此提供反馈和专家建议,以便我能够改进它。)

如果您想用默认的基于角色的目录访问来覆盖我的方法,请尝试存储文件夹的位置,并在末尾包含“/”。我编写了两个方法,“allowfolderaccess”和“denyfolderaccess”,使用了经典的 System.Web.Configuration 方法。

背景

如果您希望您的网站具有基于窗体的身份验证和基于角色的授权,您可以使用的 .NET Framework 的成员资格 API 和角色 API。使用这些的好玩之处在于,如果您不想创建自己的类和数据库结构,但又希望拥有强大的成员资格和角色管理功能,您可以使用内置于数据库中的默认提供程序。这些默认提供程序会创建一个默认数据库,ASPNETDB,并将有关用户和角色的信息存储在此数据库中。

这项功能的一大优势是,如果您不想使用默认类和默认数据库,而是希望使用自己的数据库结构,则可以根据需要修改 Web 应用程序的整个行为。您唯一需要注意的就是,您必须在类中实现一组定义的接口,以便 API 可以使用它。成员资格 API 和角色 API 具有一组您必须实现的已定义接口。例如,成员资格 API 的 MembershipProvider 接口,角色 API 的 RoleProvider 接口,配置文件 API 的 ProfileProvider 等。

那么,如何实现呢?只需在 App_Code 文件夹中创建一个名为 MyMembershipprovider 的新类,或使用您喜欢的任何名称,并使其实现 MembershipProvider,如下所示:

public class MyMembershipProvider : MembershipProvider

然后,右键单击 MembershipProvider,然后单击“实现抽象类”。系统会自动创建空的函数,您只需填空即可。

使用自定义成员资格提供程序的正确步骤是:

  1. 像往常一样在您的 web.config 文件中配置窗体身份验证,并拒绝匿名用户访问。如下所示:
    <authentication mode="Forms">
    <forms name="code-pro-ject" loginUrl="login.aspx" />
    </authentication>
    <authorization>
    <deny users="?"></deny>
    <allow roles="Administrator"></allow>
    </authorization>
  2. 设置数据存储。例如,如果您使用 SQL Server,则需要在您选择的 SQL Server 数据库中创建必要的表和存储过程。我创建了以下表:

  3. web.config 文件中,配置数据库连接字符串和您要使用的成员资格提供程序,如下所示:
    <connectionStrings>
        <add name="UsersDb" 
          connectionString="Server=.\SQLExpress;Database=SampleDb;
             Integrated Security=True;AttachDbFilename=|DataDirectory|UsersDb.mdf;
             User Instance=True;" 
          providerName="System.Data.SqlClient"/>
    </connectionStrings>

    ......

    <membership defaultProvider="MyMembershipProvider" userIsOnlineTimeWindow="20">
    <providers>
    <clear/>
    <add name="MyMembershipProvider"
    type="MyMembershipProvider"
    connectionStringName="UsersDb"
    enablePasswordRetrieval="false"
    enablePasswordReset="true"
    requiresUniqueEmail="false"
    requiresQuestionAndAnswer="false"
    passwordStrengthRegularExpression=""
    minRequiredPasswordLength="1"
    minRequiredNonalphanumericCharacters="0"
    passwordFormat="Hashed"
    applicationName="/" />
    </providers>
    </membership>
    
    <roleManager enabled="true" defaultProvider="MyRoleProvider">
    <providers>
    <clear/>
    <add name="MyRoleProvider" connectionStringName="UsersDb"
      applicationName="/"
      type="MyRoleProvider" />
    </providers>
    </roleManager>
  4. 使用 ASP.NET Web 配置实用程序,或使用您可以自己制作的自定义网站管理页面,在您的成员资格存储中创建用户。
  5. 创建一个使用预构建的 Login 控件的登录页面,或者创建一个使用 Membership 类验证输入凭据并进行用户身份验证的登录页面。

使用代码

您可以下载本文提供的代码,并直接将其复制到您的机器上进行功能检查。您可以更改 web.config 文件中 connectionStrings 设置中的数据库名称。

我已经测试了应用程序,该应用程序与我的“活动”功能一起正常工作。如果您不想使用“活动”功能,而只对自定义成员资格提供程序和自定义角色提供程序感兴趣,您可以将文件夹的位置(末尾包含“/”)存储在“活动”数据库中,并且应该可以正常工作……我包含了为此目的的功能(但我还没有完全检查过它们……请耐心等待我进一步测试,因为我目前正在处理“活动”功能)。**

这些提供程序中没有使用任何存储过程,因此您可以轻松地将我使用的字段包含到您的表中,并相应地更改 SQL 语句。这意味着您可以以更少的精力将其集成到您自己的网站中。

**请注意,此项目子目录中的 web.config 文件在其配置元素中没有 xmlns="..." 属性。这是因为我对命名空间不太熟悉。我将发布的第一个更新将能够处理此问题。但是,如果您只存储文件夹信息,我认为它应该可以正常工作,因为它不使用我的 Datamanager 类;而是使用 System.Web.Configuration 的类来修改访问权限。

注意

请按照 zemma 在本文下方的消息中为 Admin/Roles/Default.aspx 提出的更正:Button1_ClickAdmin/Roles/Default.aspxButton2_Click,以及 Admin/Roles/Default.aspxdenyfolderacces

其他链接

如果您需要有关这些主题的更多信息,可以关注这些链接:

历史

  • 2011 年 7 月 12 日:UsersDb_Log.LDF 已被删除,因为它已损坏。重新附加数据库可解决问题。数据库的 SQL 脚本也已包含在内,以防万一不起作用。如果从脚本创建数据库,用户需要在开始使用系统之前输入一些值。(许多用户抱怨日志文件已损坏。删除旧的 LDF 并重新附加新的 LDF 可以解决问题。)
© . All rights reserved.