手机
当前位置:查字典教程网 >编程开发 >asp.net教程 >asp.net Forms身份验证和基于角色的权限访问
asp.net Forms身份验证和基于角色的权限访问
摘要:主要思想:Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。具体步骤:1、创建一个网站,结构如下:网站...

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

具体步骤:

1、创建一个网站,结构如下:

网站根目录

Admin目录---->管理员目录

Manager.aspx---->管理员可以访问的页面

Users目录---->注册用户目录

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

Error目录---->错误提示目录

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

default.aspx---->网站默认页面

login.aspx---->网站登录页面

web.config---->网站配置文件

2、配置web.config如下:

复制代码 代码如下:

<configuration>

<system.web>

<>

<authentication mode="Forms">

<forms loginUrl="Login.aspx" name="MyWebApp.APSXAUTH" path="/" protection="All" timeout="30"/>

</authentication>

<authorization>

<allow users="*"/>

</authorization>

</system.web>

</configuration>

<>

<location path="Admin">

<system.web>

<authorization>

<allow roles="Admin"/>

<deny users="?"/>

</authorization>

</system.web>

</location>

<>

<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个用户,如下:

------------------------------------------

用户名密码角色字符串

------------------------------------------

sasaAdmin,User

adminadminAdmin

useruserUser

------------------------------------------

测试:

如果使用admin登录,只能访问Admin目录的Manager.aspx页面;

如果使用user登录,只能访问Users目录的Welcome.aspx页面;

使用sa登录,既能访问Admin目录的Manager.aspx页面,又能访问Users目录的Welcome.aspx页面。

注意:测试时注意及时点击安全退出按钮,否则影响测试结果。

【asp.net Forms身份验证和基于角色的权限访问】相关文章:

asp.net各种cookie代码和解析实例

asp.net 时间类 一周的周一和周末的日期

asp.net 面试+笔试题目第1/2页

asp.net动态加载用户控件,关于后台添加、修改的思考

asp. net下使用foreach简化文本文件的访问。

asp.net 事件与委托分析

Asp.net(C#)实现验证码功能代码

asp.net 操作excel的实现代码

asp.net web大文件上传带进度条实例代码

asp.net WebForm页面间传值方法

精品推荐
分类导航