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

使用自定义控件和示例轻松学习 Asp.Net 内置成员资格和角色

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (19投票s)

2014 年 3 月 8 日

CPOL

6分钟阅读

viewsIcon

62224

downloadIcon

3878

用于身份验证和授权的内置成员资格和角色。

引言

在本教程中,我尝试使用图表和示例来描述内置的成员资格和角色用于身份验证和授权。它还展示了如何在 Asp.Net Web 项目中使用自定义控件和内置 API 来应用成员资格和角色。

本教程内容列表
  • 定义身份验证和授权。
  • 成员资格详解。
  • 角色详解。
  • 创建成员资格和角色的数据库表。
  • 应用成员资格和角色的示例项目。

第一部分:定义身份验证和授权

身份验证:简而言之,身份验证是验证用户 ID 和密码以授予对站点资源的访问权限的过程。

授权:简而言之,授权是授予经过身份验证的用户访问站点受限资源的权限的过程。

第二部分:成员资格详解

Asp.net 成员资格是验证用户凭据的内置过程。它与 FormAuthentication 一起使用,允许用户验证并保存下一个请求的身份验证令牌。

我们可以使用内置的 Login 控件应用成员资格的一种方法。在这种情况下,Login 控件处理身份验证用户和保存身份验证令牌的功能。

应用成员资格的另一种方法是使用带有 TextBox 和 Button 等 asp.net 控件的登录页面,并通过成员资格的内置 API 处理身份验证。

要使用成员资格,我们必须在 web.config 文件中激活成员资格,并且必须将身份验证模式选择为“Form”。如果我们不将身份验证模式设置为 Form,则默认会激活 Windows 身份验证模式。在这种情况下,成员资格将无法工作。

我尝试使用下面的自己绘制的图来表示成员资格。

在上面的图表中,当用户尝试登录时,成员资格会检查有效用户。如果用户有效,则用户可以访问资源,否则将再次重定向到登录页面。

第三部分:角色详解

角色管理用于管理授权。我们可以通过两种方式管理授权。

  • 将访问规则应用于个别用户以限制对资源的访问。
  • 将访问规则应用于角色,以便同一角色的用户可以访问为该角色分配的资源。

下面展示了应用于个别用户的访问规则示例。

<authorization>  
   <deny users="?" />
</authorization> 

项目 web.config 文件中上面的 XML 代码段表示未经身份验证的

用户被拒绝访问应用程序的页面。

<authorization>  
  <allow users="admin1" />   
  <deny users="*" />
</authorization>

文件夹内 web.config 文件中的上面 XML 代码段表示只有“admin1”用户可以访问文件夹内的页面,而其他用户被拒绝。在这种技术中,对于每个新用户添加,都必须更新此配置文件。

当用户数量庞大时,角色管理非常有用。在这种情况下,每个用户都将属于一个角色,并且访问规则将应用于角色。

使用 Role manager,我们还可以通过检查用户角色以编程方式隐藏或显示页面的部分。检查角色的方法如下所示。

if (User.IsInRole("members"))
{
   totalWorker.Visible = True;
}

或者我们可以将规则应用于文件夹,以允许或拒绝访问该文件夹中的文件。我们可以通过以下方式进行:

<configuration>
  <location path="Manager">
    <system.web>
      <authorization>
        <allow roles="Manager" />
        <deny users="*" />
      </authorization>
    </system.web>
  </location>
<configuration>

上面的示例显示,我们可以配置 Manager 文件夹,以便只有 Manager 角色的用户才能访问此文件夹中的资源,而其他用户则被拒绝。如果未经授权的用户尝试查看受限制的页面,用户将被重定向到登录页面。

我尝试使用下面的自己绘制的图来表示成员资格和角色。

上面的图显示相同颜色的用户属于同一角色。这里不同角色的用户(管理员、经理和工人)拥有相应文件夹(管理员、经理和工人)的访问权限。任何角色的用户都必须登录才能访问资源。

第四部分:创建成员资格和角色的数据库表

在创建示例项目之前,我们需要创建一个数据库和一些必要的表来存储成员资格和角色。有关创建成员资格和角色必要表的详细信息,请阅读我的文章 https://codeproject.org.cn/Articles/708568/Create-Database-Tables-for-ASP-NET-Build-in-Member

第五部分:应用成员资格和角色的示例项目

项目摘要:此示例项目是一个 Asp.Net 项目,展示了成员资格和角色的工作原理。该项目包含一些带有页面的文件夹以及访问文件夹内资源的规则。这些应用的规则确保了允许角色的用户可以访问资源。

该项目的默认 UI 如下所示。

项目的分步描述如下。

步骤 1:首先创建一个项目,如下图所示的解决方案资源管理器。

步骤 2:Admin 文件夹包含三个页面和一个配置文件。

  1. 第一个页面是关于如何为系统添加角色的。UI 和代码如下所示。

     public partial class AddRole : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    DisplayRolesInGrid();
                }
            }
            private void DisplayRolesInGrid()
            {
                grdRoleList.DataSource = Roles.GetAllRoles();
                grdRoleList.DataBind();
            }
            protected void btnCreateRole_Click(object sender, EventArgs e)
            {
                string newRoleName = txtRoleName.Text.Trim();
                if (!Roles.RoleExists(newRoleName))
                {
                    Roles.CreateRole(newRoleName);
                    DisplayRolesInGrid();
                }
                txtRoleName.Text = string.Empty;
            }
            protected void grdRoleList_RowDeleting(object sender, GridViewDeleteEventArgs e)
            {
                Label RoleNameLabel = grdRoleList.Rows[e.RowIndex].FindControl("RoleNameLabel") as Label;
                Roles.DeleteRole(RoleNameLabel.Text, false);
                DisplayRolesInGrid();
            }
        }

    代码说明:RoleExists() 函数检查用户提供的相同角色是否已存在于数据库中。如果提供的角色名称不存在,则 CreateRole() 函数使用配置文件中提供的默认提供程序在数据库中创建该角色。

  2. 第二个页面包含注册新用户的信息。UI 和代码如下所示。

    public partial class RegisterUser : System.Web.UI.Page
        {
     
            protected void Page_Load(object sender, EventArgs e)
            {
            }
            protected void btnCreateUser_Click(object sender, EventArgs e)
            {
                try
                {
                    MembershipUser newUser = Membership.CreateUser(txtUserName.Text, txtPassword.Text, txtEmail.Text);
                    if (Membership.ValidateUser(txtUserName.Text, txtPassword.Text))
                    {
                        FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, false);
                    }
                    else
                    {
                        Msg.Text = "Fail to Register";
                    }
                }
                catch (Exception ex)
                {
                    Msg.Text = "Passwork is not strong";
                }
            }
        }

    代码说明:使用成员资格对象的 CreateUser() 函数在数据库中创建用户。然后使用 ValidateUser() 函数检查用户是否存在并将其置于登录状态。使用 FormsAuthenticationRedirectFromLoginPage() 函数创建身份验证令牌。

  3. 第三个页面是将角色分配给用户。UI 和代码如下所示。

    public partial class UserToRole : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    BindList();
                    DisplayUserRolesInGrid();
                }
            }
            private void DisplayUserRolesInGrid()
            {
                using (CustomMembershipEntities dataContext = new CustomMembershipEntities())
                {
                    var UserRole = (from u in dataContext.aspnet_Users.Include("aspnet_Roles")
                                    from r in u.aspnet_Roles
                                    where r != null
                                    select new { User = u, Role = r }).ToList();
                    grdUserRoles.DataSource = UserRole.ToArray();
                    grdUserRoles.DataBind();
                }
            }
            private void BindList()
            {
                foreach (var role in Roles.GetAllRoles())
                {
                    ddlRole.Items.Add(new ListItem(role, role));
                }
                foreach (MembershipUser user in Membership.GetAllUsers())
                {
                    ddlUser.Items.Add(new ListItem(user.UserName, user.UserName));
                }
            }
            protected void btnRoleAssign_Click(object sender, EventArgs e)
            {
                string roleName = ddlRole.SelectedItem.Text;
                string userName = ddlUser.SelectedItem.Text;
                if (!User.IsInRole(roleName))
                {
                    Roles.AddUserToRole(userName, roleName);
                }
            }
        }

    代码说明:User 对象的 IsInRole() 函数检查用户是否已分配到选定的角色。如果未分配,则 Roles 对象的 AddUserToRole() 函数将角色分配给选定的用户。

  4. Web.config 文件。Web.config 文件的内容如下。
    <configuration>
      <system.web>
        <authorization>
          <allow roles="Admin" />
          <deny users="*" />
        </authorization>
      </system.web>
    </configuration>
    

    XML 说明:此 XML 段表示只有拥有 Admin 角色的用户才能访问此文件夹的资源,而所有其他用户都被拒绝。

步骤 3:Manager 文件夹包含一个页面和一个配置文件。

  1. 第一个页面是为 Manager 角色用户准备的仪表板。要访问页面,用户需要以 Member 角色登录。UI 和代码如下所示。

    此页面不包含代码。请添加必要的功能来显示信息。

  2. 此文件夹包含一个配置文件。Web.config 文件的内容如下。
    <configuration>
      <system.web>
        <authorization>
          <allow roles="Manager" />
          <deny users="*" />
        </authorization>
      </system.web>
    </configuration>

    XML 说明:此 XML 段表示只有拥有 Manager 角色的用户才能访问此文件夹的资源,而所有其他用户都被拒绝。

步骤 4:Worker 文件夹包含一个页面和一个配置文件。

  1. 该页面由工人用于保存他/她的每日信息。要
    访问页面,用户需要以 Worker 角色登录。UI 和代码如下
    所示。

    此页面不包含代码。请添加必要的功能来显示
    信息。

  2. 此文件夹包含一个配置文件。Web.config 的内容
    如下。
    <configuration>
      <system.web>
        <authorization>
          <allow roles="Worker" />
          <deny users="*" />
        </authorization>
      </system.web>
    </configuration>
    

    XML 说明:此 XML 段表示只有拥有 Worker 角色的用户才能访问此文件夹的资源,而所有其他用户都被拒绝。

结论

以上是关于 Asp.Net 内置成员资格和角色的全部内容。希望这能帮助您对 Asp.Net 身份验证和授权有所了解。附件包含项目和数据库备份。

我的已发布文章

  1. https://codeproject.org.cn/Articles/661878/Implementation-of-MVC-Patterns-in-ASP-NET-Web-form
  2. https://codeproject.org.cn/Articles/674959/MVC-Patterns-Active-and-Passive-Model-and-its
  3. https://codeproject.org.cn/Articles/708568/Create-Database-Tables-for-ASP-NET-Build-in-Member
  4. https://codeproject.org.cn/Articles/691691/Apply-Here-Map-in-Windows-Phone-HTML-Apps
© . All rights reserved.