当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.net Forms身份验证和基于角色的权限访问

ASP.NET
ASP.NET开发:简化应用程序的开发支持Web标准
asp.net XMLHttpRequest实现用户注册前的验证
asp.net 页面间传值方法小结
asp.net url重写浅谈
asp.net 验证码生成和刷新及验证
C#精髓 GridView72大绝技 学习gridview的朋友必看
实例说明asp.net中的简单角色权限控制
asp.net网站开发包wq.dll打包下载
js与ASP.NET 中文乱码问题
asp.net checkbox 动态绑定id GridView删除提示
asp.net TextBox回车触发事件 图片在img显示
asp.net 脏字典过滤问题 用正则表达式来过滤脏数据
asp.NET 脏字过滤算法
asp.NET 脏字过滤算法 修改版
asp.net sql 数据库处理函数命令
asp.net Javascript 的几种写法与提示
ASP.NET MVC学习笔记
asp.net 中国身份证号码验证代码 非正则
Asp.net中使用Sqlite数据库的方法
asp.net 中文字符串提交乱码的解决方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-11   浏览: 265 ::
收藏到网摘: n/a

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