`
king_tt
  • 浏览: 2111398 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ASP.NET基于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>

<allowroles="Admin"/>

<denyusers="?"/>

</authorization>

</system.web>

</location>

<!--设置Users目录的访问权限-->

<location path="Users">

<system.web>

<authorization>

<allowroles="User"/>

<denyusers="?"/>

</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

{

ClientScriptManagercsm = this.Page.ClientScript;

csm.RegisterStartupScript(this.GetType(),"error_tip", "alert('用户名或密码错误!身份验证失败!');", true);

}

}

//验证用户

private UserModel ValidUser(string name, string password)

{

return newUserService().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页面。

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics