zoukankan      html  css  js  c++  java
  • 【C#.NET】保护你的ASP.NET应用程序(五)成员资格和角色管理API编程

    15.8  成员资格和角色管理API编程

    15.8.1  成员资格API概述

    “成员资格”功能围绕两个中心类来生成:Membership和MembershipUser。Membership类提供用于创建用户(由MembershipUser类表示)的方法,以及用于管理用户的常见管理方法。使用Membership 类创建的用户表示一个ASP.NET应用程序的经过身份验证的标识。

    使用Membership类执行的常见任务包括:

    ·      创建新的MembershipUser

    ·      用户登录

    ·      检索MembershipUser实例

    ·      更新MembershipUser实例

    ·      基于各种搜索条件搜索用户

    ·      获取当前在线的经过身份验证的用户的数量

    ·      不再需要某些用户时从系统中删除这些用户

    获取一个MembershipUser实例之后,直接使用MembershipUser类执行的常见任务包括如下:

    ·      访问应用程序中MembershipUser类的属性

    ·      检索用户密码(仅在成员资格功能被配置成允许密码检索的条件下)

    ·      更改用户密码或重置用户密码

    ·      更改用户的密码提示问题和密码答案(如果成员资格功能已被配置成在检索或更新密码前,提示用户输入密码提示问题和答案)

    ·      解除对由于密码错误或密码答案错误而被锁定的用户的锁定

    15.8.2  角色管理API概述

    角色管理器的中央管理类是Roles类。Roles类提供用于创建角色并将用户分配给角色的方法。它还提供用于管理角色信息的常见管理方法。

    使用Roles类执行的常见任务包括:

    ·      创建新角色。

    ·      删除现有角色。

    ·      将用户分配到角色。

    ·      从角色中移除用户。

    ·      确定是否已将某个用户授权给某一特定角色。

    ·      搜索某一特定角色中的用户,以及检索某一角色中的所有用户。

    ·      获取特定用户的角色信息。

    角色管理器功能还包括HttpModule。此模块负责检索用户的角色分配并将该信息存储在RolePrincipal内,后者可在页的HttpContext上找到。HttpContext上存在RolePrincipal时,你可以使用<authorization>元素保护页和目录。根据RolePrincipal中所存储的角色信息的不同,可以只授权用户访问站点内的特定页和目录。

    下面,我们将演示几种常见的操作。

    15.8.3  创建、修改、获取和删除用户

    在网站下创建一个API目录,并创建一个UserManagement.aspx。在页面上放置4个按钮,用于实现用户的创建、修改、获取以及删除操作。

    <asp:Button ID="btn_CreateUser" runat="server" Text="创建用户" />

    <asp:Button ID="btn_DeleteUser" runat="server" Text="删除用户" />

    <asp:Button ID="btn_GetUserInfo" runat="server" Text="获取用户信息" />

    <asp:Button ID="btn_UpdateUser" runat="server" Text="更新用户" />

    4个按钮的单击事件处理方法如下:

    protected void btn_CreateUser_Click(object sender, EventArgs e)

    {

        string username = "SalesDirector";

        string password = "abcd_1234";

        string email = "test@test.com";

        string passwordQuestion = "111";

        string passwordAnswer = "222";

        // 是否允许新用户登录

        bool isApproved = true;

        MembershipCreateStatus membershipCreateStarus;

        Membership.CreateUser(username, password, email, passwordQuestion,

        passwordAnswer, isApproved, out membershipCreateStarus);

        // membershipCreateStarus是一个枚举,为了简单我们直接输出枚举名称

        Response.Write(membershipCreateStarus.ToString());

    }

    protected void btn_DeleteUser_Click(object sender, EventArgs e)

    {

        string username = "SalesDirector";

        // 删除与用户关联的数据

        bool deleteAllRelatedData = true;

        bool operationResult = Membership.DeleteUser(username, deleteAllRelatedData);

        Response.Write(operationResult? "删除成功":"删除失败");

    }

    protected void btn_UpdateUser_Click(object sender, EventArgs e)

    {

        string username = "SalesDirector";

        MembershipUser user = Membership.GetUser(username);

        user.Email = "newemail@test.com";

        Membership.UpdateUser(user);

    }

    protected void btn_GetUserInfo_Click(object sender, EventArgs e)

    {

        string username = "SalesDirector";

        MembershipUser user = Membership.GetUser(username);

        if (user == null)

            Response.Write("用户不存在");

        else

        {

            Response.Write(string.Format("用户名:{0}<br/>", user.UserName));

            Response.Write(string.Format("电子邮箱:{0}<br/>", user.Email));

        }

    }

    代码非常简单,在这里就不作过多介绍了。浏览页面,首先单击“创建用户按钮”,结果如图15-51所示。

    然后单击“获取用户信息”按钮,结果如图15-52所示。

          

    图15-51  创建用户                                  图15-52  获取用户信息

    再先后单击“更新用户”按钮和“获取用户信息”按钮,结果如图15-53所示。

    最后,先后单击“删除用户”按钮和“获取用户信息”按钮,结果如图15-54所示。

              

    图15-53  更新用户                                      图15-54  删除用户

    15.8.4  验证和解锁用户

    如下,在页面上再创建两个按钮“验证用户”和“解锁用户”。

    <asp:Button ID="btn_ValidateUser" runat="server" Text="验证用户" />

    <asp:Button ID="btn_UnlockUser" runat="server" Text="解锁用户" />

    两个按钮的单击事件处理方法如下:

    protected void btn_ValidateUser_Click(object sender, EventArgs e)

    {

        if (Membership.ValidateUser("SalesDirector", "abcd_1234"))

            Response.Write("验证通过");

        else

            Response.Write("验证失败");

    }

    protected void btn_UnlockUser_Click(object sender, EventArgs e)

    {

        string username = "SalesDirector";

        MembershipUser user = Membership.GetUser(username);

        // 检测用户是否存并且是否已被锁定

        if (user != null && user.IsLockedOut)

        {

            if (user.UnlockUser())

                Response.Write("解除锁定成功");

            else

                Response.Write("解除锁定失败");

        }

        else

            Response.Write("用户不存在或者未被锁定");

    }

    单击“验证用户”按钮的结果如图15-55所示。

    图15-55  验证用户

    由于这个用户是新建的,因此处于未锁定状态,单击“解除锁定”按钮,提示“用户不存在或者未被锁定”。

    15.8.5  角色管理

    在API目录下新建一个RoleManagement.aspx页面。在页面上加入4个按钮控件,分别实现创建角色、删除角色、向角色加入用户和从角色删除用户4个操作:

    <asp:Button ID="btn_CreateRole" runat="server" Text="创建角色" />

    <asp:Button ID="btn_DeleteRole" runat="server" Text="删除角色" />

    <asp:Button ID="btn_AddUserToRole" runat="server" Text="向角色加入用户" />

    <asp:Button ID="btn_RemoveUserFromRole" runat="server" Text="从角色删除用户"/>

    4个按钮的单击事件处理方法如下:

    protected void btn_DeleteRole_Click(object sender, EventArgs e)

    {

        if (!Roles.RoleExists("Director"))

        {

            Response.Write("角色不存在");

            return;

        }

        if (Roles.GetUsersInRole("Director").Length > 0)

        {

            Response.Write("请先删除角色中的用户");

            return;

        }

        Roles.DeleteRole("Director");

        Response.Write("角色删除成功");

    }

    protected void btn_AddRole_Click(object sender, EventArgs e)

    {

        if (Roles.RoleExists("Director"))

        {

            Response.Write("角色已存在");

            return;

        }

        Roles.CreateRole("Director");

        Response.Write("角色创建成功");

    }

    protected void btn_RemoveUserFromRole_Click(object sender, EventArgs e)

    {

        if (!Roles.RoleExists("Director"))

        {

            Response.Write("角色不存在");

            return;

        }

        if (Membership.GetUser("SalesDirector")==null)

        {

            Response.Write("用户不存在");

            return;

        }

        //从角色中删除多个用户

        //Roles.RemoveUsersFromRole(new string[] { "SalesDirector" }, "Director");

        Roles.RemoveUserFromRole("SalesDirector", "Director");

    }

    protected void btn_AddUserToRole_Click(object sender, EventArgs e)

    {

        if (!Roles.RoleExists("Director"))

        {

            Response.Write("角色不存在");

            return;

        }

        if (Membership.GetUser("SalesDirector") == null)

        {

            Response.Write("用户不存在");

            return;

        }

        //向角色加入多个用户

        //Roles.AddUsersToRole(new string[] { "SalesDirector" }, "Director");

        Roles.AddUserToRole("SalesDirector", "Director");

    }

    启用页面,单击“创建角色”按钮,输出如图15-56所示。

    单击“向角色加入用户”按钮,然后单击“删除角色”按钮,输出如图15-57所示,说明用户确实加入了角色。

        

    图15-56  创建角色                                    图15-57  向角色加入用户

    再单击“从角色删除用户”按钮,然后单击“删除用户”按钮,输出如图15-58所示,说明从角色删除用户成功。

    最后,单击“向角色加入用户”按钮,输出如图15-59所示,说明角色成功被删除。

      

    图15-58  从角色删除用户                               图15-59  删除角色

    15.8.6  角色验证

    最后,让我们来使用编程方式验证当前用户是否属于某个角色。在API目录下新建一个RoleAuthorization.aspx文件。修改Page_Load事件的处理方法如下:

    protected void Page_Load(object sender, EventArgs e)

    {

        Response.Write(User.IsInRole("Director") + "<br/>");

        Response.Write(Roles.IsUserInRole("Director") + "<br/>");

        Response.Write(((RolePrincipal)User).IsInRole("Director") + "<br/>");

    }

    三句代码都实现了相同的效果——验证当前通过身份验证的用户是否属于某个角色。先打开之前创建的UserManagement.aspx和RoleManagement.aspx来创建用户“SalesDirector”,并把他加入“Director”角色。然后到根目录下的Login.aspx进行登录,最后访问RoleAuthorization.aspx可以看到输出的页面。如图15-60所示。

    文本框:  
图15-60  角色验证

15.8.7  其他重要成员

    在前几节中,笔者演示了常见的一些成员资格和角色管理器API的成员,除此之外还有一些没有提到的重要成员,如下表所示。

    Membership类:

    成员

    作用

    FindUsersByEmail()方法

    根据电子邮件地址找到一组成员资格用户

    FindUsersByName()方法

    根据用户名找到一组成员资格用户

    GetAllUsers()方法

    获取数据库中用户的集合

    GetNumberOfUsersOnline()方法

    获取访问当前应用程序的用户数

    GetUserNameByEmail()方法

    根据电子邮件地址找到一个匹配的用户名

    MembershipUser类:

    成员

    作用

    ChangePassword()方法

    更新用户的密码

    ChangePasswordQuestionAndAnswer()方法

    更新密码提示问题和答案

    GetPassword()方法

    获取用户的密码

    ResetPassword()方法

    将用户密码重置为一个自动生成的新密码

    IsOnline属性

    表示用户是否联机

    CreationDate属性

    获取用户创建时间

    Roles类:

    成员

    作用

    FindUsersInRole()方法

    获取属于指定角色的用户的列表

    续表

    成员

    作用

    GetAllRoles()方法

    获取所有角色

    GetRolesForUser()方法

    获取一个用户所属角色的列表

    GetUsersInRole()方法

    获取属于某角色的用户列表

    15.9  回顾与总结

    本章我们对ASP.NET的安全机制做了一个大致的介绍,覆盖的内容非常广,涉及到授权、模拟、验证、ASP.NET 2.0成员资格和角色管理器以及ASP.NET 2.0登录控件等。

    15.1节解释了与安全相关的一些名词并概述了ASP.NET安全体系和身份验证方式。

    15.2节介绍了如何模拟请求用户的账户、模拟一个独立账户和使用编程方式临时模拟账户。

    15.3节介绍了基于Windows的身份验证的一些服务器配置(IIS和NTFS文件夹)、如何配置Web.config来实现授权以及如何实现自定义角色等。

    15.4节介绍了如何使用基于表单的身份验证来进行验证和票据管理、如何使用Web.config进行用户账户管理以及如何获取用户信息等。

    15.5节总体介绍了ASP.NET 2.0成员资格和角色管理器。涉及成员资格和角色管理器的启用和配置、ASP.NET登录控件和ASP.NET网站管理工具等内容。

    15.6节演示了ASP.NET登录控件的使用,通过登录控件,我们无需编写一行代码就能实现面向用户的一套成员管理系统。

    15.7节介绍了如何使用ASP.NET网站管理工具来进行成员资格和角色管理器的配置。

    15.8节介绍了如何使用成员资格和角色管理器API来以编程方式实现用户管理、角色管理和角色授权。

  • 相关阅读:
    VMWare虚拟机下为Ubuntu 12.04.1配置静态IP(NAT方式)
    VMWare虚拟机下为Windows Server 2012配置静态IP(NAT方式)
    Windows 7防火墙阻止了远程桌面连接的解决方法
    Win10系统如何在防火墙里开放端口
    ECharts 定制 label 样式
    目标值柱状图
    echarts中datazoom相关配置
    环形图
    带时间轴的指标监控柱状图
    2020mysql面试题
  • 原文地址:https://www.cnblogs.com/cuishao1985/p/1574164.html
Copyright © 2011-2022 走看看