Asp.Net Forms验证(自定义、角色提供程序)

来源:互联网 发布:python写入txt文件 编辑:程序博客网 时间:2024/05/17 09:19
最经济的.NET技能培训模式
金旭亮等名师共同打造 为您提供促进就业机会
在职人员学.NET最佳选择
在家、在单位即可学习,免除脱产烦恼 实战教学、专家指导,教学质量有保障
越老越吃香的职业
陈绍英LoadRunner系列 LoadRunner性能测试入门与虚拟用户开发基础
学会一技之长,终身受益
金旭亮为首讲师团教您学.NET 全程实战教学,学员实战练习
以前开发项目时经常是自己开发一套用户权限管理系统进行验证,比较灵活。最近为了单点登录的问题又把Asp.Net自带的验证方式看了一遍,发现这种方式也比较方便,功能也还可以。在Asp.Net提供了三种常用的验证方式:Windows方式是和IIS结合起来可以实现基本、摘要、集成 Windows等身份验证;Passport方式是使用Windows Live ID的帐户来进行统一验证的;Forms方式是使用常见的表单来实现验证。

本文主要就是讨论Forms验证方式普通实现、自定义实现、自定义角色提供程序、如何单点登录(可和MOSS结合)等几个方面。

一、普通实现方式
这种方式是最简单的,只需要配置一下就可以了。
1、执行aspnet_regsql命令建立数据库
aspnet_regsql命令在C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727目录下,按提示运行就可以了

2、新建一个web网站
在Web.Config中加入配置:

















enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true"
requiresUniqueEmail="true" passwordFormat="Hashed" name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider" />



主要就是指定Forms验证使用的数据库,如果不指定数据库会使用本机默认的aspnetdb 数据库。
deny users="?"表示不允许匿名用户访问,也就是说当匿名用户访问时自动跳转到下面配置的login.aspx页面。
至于authorization和authentication节的其他属性可以参考MSDN,里面有很详细的介绍。

3、在网站里创建Default.aspx和Login.aspx页面
在Login.aspx页面里面放入Login和CreateUserWizard控件(因为我们新建的库中一个用户也没有,CreateUserWizard控件只是用来建立测试用户的,建好用户后可以把这个控件删除)
在Default.aspx页面中随便放入一些内容。
当我们访问Default.aspx时就会自动转入Login.aspx进行验证了。

二、自定义实现方式
采用第一种方式时会要求建立一个数据库,很多表,可能并不符合我们自己的业务要求。可以使用以下的自定义方式
1、利用Login控件的Authenticate事件
这个事件就是用来进行验证的,可以通过指定true值表示验证通过:
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
//判断用户名密码是否正确
//
e.Authenticated = true;
}2、完全抛开Login等控件,自己写代码
其实Login控件的核心主要也就是往Cookie里面放入一些值,那么我们可以在自己的代码中来进行这个操作:
protected void Button1_Click(object sender, EventArgs e)
{
//判断用户名密码是否正确
//.
FormsAuthentication.SetAuthCookie(userName, false);
if (Context.Request["ReturnUrl"] != null)
{
Response.Redirect(Context.Request["ReturnUrl"]);
}
else
{
Response.Redirect(FormsAuthentication.DefaultUrl);
}
}采用以上两种方式就不用建立默认的数据库了,直接使用我们的逻辑进行验证操作

三、自定义角色提供程序
以上说的都是用户级别的验证,在有的情况下需要根据角色来进行验证,比如指定某个目录或某个aspx文件只能让哪几个角色的用户访问,根据角色来控制的话比较方便灵活。
1、在登录验证的时候把角色信息也保存到Cookie中去:
protected void Button1_Click(object sender, EventArgs e)
{
//判断用户名密码是否正确
//.

//得到用户的角色,测试时暂时写死
string userRoles = "Admins,testst";
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, user, DateTime.Now, DateTime.Now.AddMinutes(30), false, userRoles, "/");
string HashTicket = FormsAuthentication.Encrypt(Ticket);

//把角色信息保存到Cookie中去
HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);
Response.Cookies.Add(UserCookie);

if (Context.Request["ReturnUrl"] != null)
{
Response.Redirect(Context.Request["ReturnUrl"]);
}
else
{
Response.Redirect(FormsAuthentication.DefaultUrl);
}
}把角色信息加密成特定的格式保存。
2、自定义角色提供程序
如果要按照角色进行验证的话,肯定要涉及到角色提供程序,在默认情况下也是会去连接默认的数据库的,我们可以自己写一个角色提供程序来实现自己的逻辑。
首先在web.config中加入配置:
Code
enabled="true"
cacheRolesInCookie="true"
cookieName=".ASPROLES"
cookieTimeout="30"
cookiePath="/"
cookieRequireSSL="false"
cookieSlidingExpiration="true"
cookieProtection="All" >


type="MyRoleProvider"
writeExceptionsToEventLog="false" />

这个就是指定我们的角色提供类MyRoleProvider。
这个类必须从System.Web.Security.RoleProvider继承,只要重载实现一个方法就可以了(其他方法返回异常):
public override string[] GetRolesForUser(string username)
{
FormsIdentity Id = HttpContext.Current.User.Identity as FormsIdentity;
if (Id != null)
{
return Id.Ticket.UserData.Split(new Char[] { ',' });
}
return null;
}也就是从我们之前保存到Cookie中的值取得用户角色(FormsAuthentication会自动把保存的cookie转化成User内的值)

之后我们就可以在web.config中配置角色验证规则了:







或者也可以在代码中判断:
bool a = User.IsInRole("testt"); 判断起来还是很方便的。
  1. <a herf="http://www.cnblogs.com/firstyi/archive/2008/04/22/1166053.html">点击查看原文</a>
<<