asp.net登录 用Forms身份验证和基于角色的分目录访问

本文介绍如何使用ASP.NET的Forms身份验证实现基于角色的访问控制。通过具体实例,包括网站目录结构、web.config配置、登录逻辑及页面权限检查等步骤,确保只有经过身份验证的用户才能访问指定页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。

主要思想:Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。 

具体步骤:
1、创建一个网站,结构如下:
网站根目录
Admin目录 ----> 管理员目录
Manager.aspx ----> 管理员可以访问的页面

Users目录 ----> 注册用户目录
Welcome.aspx ----> 注册用户可以访问的页面

Error目录 ----> 错误提示目录
AccessError.htm ----> 访问错误的提示页面

default.aspx ----> 网站默认页面
login.aspx ----> 网站登录页面
web.config ----> 网站配置文件


2、配置web.config如下: 


<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <!--设置Forms身份验证-->
        <authentication mode="Forms">
          <forms loginUrl="Login.aspx" name=".APSXAUTH" path="/" protection="All" timeout="30"/>
        </authentication>
        <authorization>
          <allow users="*"/>
        </authorization>
    </system.web>


    <!--设置Admin目录的访问权限-->
    <location path="Admin">
      <system.web>
        <authorization>
          <allow roles="Admin"/>
          <deny users="?"/>
        </authorization>
      </system.web>
    </location>
    <!--设置Users目录的访问权限-->
    <location path="Users">
      <system.web>
        <authorization>
          <allow roles="User"/>
          <deny users="?"/>
        </authorization>
      </system.web>
    </location>


</configuration>


3、在login.aspx页面的登录部分代码如下: 



html代码
<body>
    <form id="form1" runat="server">
        帐号:<asp:TextBox 
            ID="txtName" runat="server"></asp:TextBox>
        &nbsp;密码: 
        <asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="登录" onclick="btnLogin_Click" />
        <br />
        <br />
        <br />
        <br />
        <a href="Admin/Manager.aspx">转到Admin</a>
        <br />
        <br />
        <a href="Users/Welcome.aspx">转到Users</a>
    </form>
</body>

cs代码
        protected void btnLogin_Click(object sender, EventArgs e)
        {
            string um = txtName.Text.Trim();


            string uesrname = null;  //用户名
            //string password = null;  //密码
            string Roles = null;     //角色字符串 
            if (um == "sa")
            {
                uesrname = "sa";
                //password = "sa";
                Roles = "Admin,User";
            }
            else if (um == "admin")
            {
                uesrname = "admin";
                //password = "admin";
                Roles = "Admin";
            }
            else 
            {
                uesrname = "user";
                //password = "user";
                Roles = "User";
            }


            //Forms身份验证初始化 
            FormsAuthentication.Initialize();
            //验证用户输入并得到登录用户,txtName是用户名称,txtPassword是登录密码 
            //UserModel um = ValidUser(uesrname, password);


            if (um != null)
            {
                //创建身份验证票据 
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                                               uesrname,
                                               DateTime.Now,
                                               DateTime.Now.AddMinutes(30),
                                               false,
                                               Roles,//用户所属的角色字符串 
                                               FormsAuthentication.FormsCookiePath);
                //加密身份验证票据 
                string hash = FormsAuthentication.Encrypt(ticket);
                //创建要发送到客户端的cookie 
                HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
                //if (ticket.IsPersistent)
                //{
                //    cookie.Expires = ticket.Expiration;
                //}
                //把准备好的cookie加入到响应流中 
                Response.Cookies.Add(cookie);


                //转发到请求的页面
                if (um == "admin")
                {
                    Response.Redirect("/admin/Manager.aspx");// 定向到某一个页面
                }
                else if (um == "user")
                {
                    Response.Redirect("/Users/Welcome.aspx");// 定向到某一个页面
                }
            }
            else
            {
                ClientScriptManager csm = this.Page.ClientScript;
                csm.RegisterStartupScript(this.GetType(), "error_tip", "alert('用户名或密码错误!身份验证失败!');", true);
            }
        }


4、给网站添加处理程序Global.asax,其中通用身份验证代码如下:
using System.Security.Principal;

        //改造原来的User,给其添加一个用户所属的角色数据 
        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            if (HttpContext.Current.User != null)
            {
                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    if (HttpContext.Current.User.Identity is FormsIdentity)
                    {
                        FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                        FormsAuthenticationTicket ticket = id.Ticket;

                        string userData = ticket.UserData;
                        string[] roles = userData.Split(',');
                        //重建HttpContext.Current.User,加入用户拥有的角色数组 
                        HttpContext.Current.User = new GenericPrincipal(id, roles);
                    }
                }
            }
        } 

5、在Admin目录中Manager.aspx页面加载代码如下:

html代码
    <form id="form1" runat="server">
    <div>
    
        登录【Admin】成功。。。。<br />
        <br />
        <br />
        <asp:Button ID="Button1" runat="server" onclick="btnExit_Click" Text="退出" />
        <br />
        <br />
        <a href="../Users/Welcome.aspx">转到Users</a>

    </div>
    </form>

cs代码
using System.Web.Security;

        protected void Page_Load(object sender, EventArgs e)
        {
            //判断通过身份验证的用户是否有权限访问本页面 
            FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
            //判断通过身份验证的用户是否是Admin角色 
            if (!id.Ticket.UserData.Contains("Admin"))
            {
                //跳转到访问权限不够的错误提示页面 
                Response.Redirect("~/Error/AccessError.htm", true);
            } 
        }

        //安全退出按钮的代码 
        protected void btnExit_Click(object sender, EventArgs e)
        {
            //注销票据 
            FormsAuthentication.SignOut();
            ClientScriptManager csm = this.Page.ClientScript;
            csm.RegisterStartupScript(this.GetType(), "exit_tip", "alert('您已经安全退出了!');", true);
        } 

6、在Users目录中Welcome.aspx页面加载代码如下: 

html代码
    <form id="form1" runat="server">
    <div>
        
        登录【Users】成功。。。。<br />
        <br />
        <br />
        <asp:Button ID="Button1" runat="server" onclick="btnExit_Click" Text="退出" />
        <br />
        <br />
        <a href="../Admin/Manager.aspx">转到Admin</a>
    
    </div>
    </form>

cs代码
using System.Web.Security;

        protected void Page_Load(object sender, EventArgs e)
        {
            //判断通过身份验证的用户是否有权限访问本页面 
            FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
            //判断通过身份验证的用户是否是User角色 
            if (!id.Ticket.UserData.Contains("User"))
            {
                //跳转到访问权限不够的错误提示页面 
                Response.Redirect("~/Error/AccessError.htm", true);
            } 
        }


        //安全退出按钮的代码 
        protected void btnExit_Click(object sender, EventArgs e)
        {
            //注销票据 
            FormsAuthentication.SignOut();
            ClientScriptManager csm = this.Page.ClientScript;
            csm.RegisterStartupScript(this.GetType(), "exit_tip", "alert('您已经安全退出了!');", true);
        } 

7、在Error目录中AccessError.htm页面加载代码如下: 

<body>

    <p>拒绝访问.....返回登录<a href="../login.aspx">Login.aspx</a></p>

</body>



测试结果:
数据:
假设有3个用户,如下:
------------------------------------------
用户名         密码             角色字符串
------------------------------------------
sa               sa                  Admin,User
admin        admin           Admin
user           user              User
------------------------------------------
测试:
如果使用admin登录,只能访问Admin目录的Manager.aspx页面;
如果使用user登录,只能访问Users目录的Welcome.aspx页面;
使用sa登录,既能访问Admin目录的Manager.aspx页面,又能访问Users目录的Welcome.aspx页面。
注意:测试时注意及时点击安全退出按钮,否则影响测试结果。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值