源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 86|回复: 26

[ASP.NET] asp.net Forms身份验证和基于角色的权限访问

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2009-9-25 15:14:33 | 显示全部楼层 |阅读模式
Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。 主要思想:Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。
具体步骤:
    1、创建一个网站,结构如下:
        网站根目录
            Admin目录            ---->    管理员目录
                Manager.aspx        ---->    管理员可以访问的页面
            Users目录            ---->    注册用户目录
                Welcome.aspx        ---->    注册用户可以访问的页面
            Error目录            ---->    错误提示目录
                AccessError.htm        ---->    访问错误的提示页面
            default.aspx            ---->    网站默认页面
            login.aspx            ---->    网站登录页面
            web.config            ---->    网站配置文件
    2、配置web.config如下:
复制代码 代码如下:
        <configuration>
            <system.web>
                <!--设置Forms身份验证-->
                <authentication mode="Forms">
                    <forms loginUrl="Login.aspx" name="MyWebApp.APSXAUTH" path="/" protection="All" timeout="30"/>
                </authentication>
                <authorization>
                    <allow users="*"/>
                </authorization>
            </system.web>
        </configuration>

        <!--设置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>

    3、在login.aspx页面的登录部分代码如下:
复制代码 代码如下:
        protected void btnLogin_Click(object sender, EventArgs e)
        {    
            //Forms身份验证初始化
            FormsAuthentication.Initialize();
            //验证用户输入并得到登录用户,txtName是用户名称,txtPassword是登录密码
            UserModel um = ValidUser(txtName.Text.Trim(),txtPassword.Text.Trim());
            if (um != null)
            {
             //创建身份验证票据
             FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                                            um.Name,
                                            DateTime.Now,
                                            DateTime.Now.AddMinutes(30),
                                            true,
                                            um.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);

             //转发到请求的页面
             Response.Redirect(FormsAuthentication.GetRedirectUrl(um.Name,false));
            }
            else
            {
             ClientScriptManager csm = this.Page.ClientScript;
             csm.RegisterStartupScript(this.GetType(), "error_tip", "alert('用户名或密码错误!身份验证失败!');", true);
            }
        }    
        //验证用户
        private UserModel ValidUser(string name, string password)
        {
            return new UserService().Validate(name, password);
        }

    4、给网站添加处理程序Global.asax,其中通用身份验证代码如下:
复制代码 代码如下:
        //改造原来的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页面加载代码如下:
复制代码 代码如下:
        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页面加载代码如下:
复制代码 代码如下:
        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);
        }

测试结果:
    数据:
        假设有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页面。
    注意:测试时注意及时点击安全退出按钮,否则影响测试结果。
回复

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2022-8-19 12:13:00 | 显示全部楼层
好人好人好人好人
回复 支持 反对

使用道具 举报

16

主题

2万

回帖

376

积分

中级会员

Rank: 3Rank: 3

积分
376
发表于 2022-10-14 21:55:26 | 显示全部楼层
啦啦啦啦啦啦啦啦!
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

55

积分

注册会员

Rank: 2

积分
55
发表于 2022-11-25 14:00:12 | 显示全部楼层
非常vbcbvcvbvcb
回复 支持 反对

使用道具 举报

14

主题

1万

回帖

75

积分

注册会员

Rank: 2

积分
75
发表于 2022-12-24 12:38:54 | 显示全部楼层
呵呵呵呵呵呵
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2023-6-26 22:46:31 | 显示全部楼层
逛逛看看瞧瞧
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

61

积分

注册会员

Rank: 2

积分
61
发表于 2023-10-16 22:11:10 | 显示全部楼层
vcxvcxv
回复 支持 反对

使用道具 举报

16

主题

2万

回帖

376

积分

中级会员

Rank: 3Rank: 3

积分
376
发表于 2023-10-19 14:34:23 | 显示全部楼层
谢谢您的分享!
回复 支持 反对

使用道具 举报

1

主题

2万

回帖

69

积分

注册会员

Rank: 2

积分
69
发表于 2023-12-11 08:29:00 | 显示全部楼层
的vgdsvsdvdsvdsvds
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2024-7-4 12:42:00 | 显示全部楼层
的vgdsvsdvdsvdsvds
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2025-2-5 22:46 , Processed in 0.144084 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表