疯子的博客

做一件事,专注一件事
ASP.NET 2.0 中的窗体身份验证


最近对cms起了兴趣,到网上找了几个开源的cms系统看看。其中有个是Ludico,没想到配置过程走了不少弯路。

Ludico的身份验证是基于asp.netforms身份验证的。我们一般都是用默认的windows身份验证,也就是匿名账户IUSR_XX-XX

   窗体身份验证使用用户登录到站点时创建的身份验证票,然后在整个站点内跟踪该用户。窗体身份验证票通常包含在一个 Cookie 中。

   具体,大家如果有兴趣自己到网上找找资料看,下面看看配置过程。

1.建立身份验证数据库。

2.运行aspnet_regsql.exe(在.Net框架安装目录下)来生成该数据库的Membership结构。选择为应用程序配置SqlServer,重要的是选择数据库。

3.到这里Membership的结构已经生成好了

4.在应用程序根目录的web.config中,统一配置用户验证,权限设置,Membership设置以及roleManage设置。配置数据库连接字符串,Membership节和roleManager

Code
5.运用Membership API,用户可在合适的地方创建角色,代码如下

 

       

 if(!Roles.RoleExists("administrator"))
           Roles.CreateRole(
"administrator");
         
if (!Roles.RoleExists("common_user"))
         Roles.CreateRole(
"common_user");

    当然Membership也提供大量的其他接口,来为我们实现一个完整的用户管理系统提供强有力的支持,在此就不做展开了

6.实现用户登陆

   //其他代码忽略,此处是点击登陆按钮后的操作,在这里,我们创建本地cookies凭证,从而成功登陆系统

    

protected void Button2_Click(object sender, EventArgs e)
     {
         
string username = myname.Text;
         
string password = mypass.Text;
        
if (Membership.ValidateUser(username, password)) 

        {
             
//FormsAuthentication.SetAuthCookie(username,true);
             FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddMinutes(60), false"");
             
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); // 现在对票证进行加密。

            HttpCookie authCookie 
=new HttpCookie(FormsAuthentication.FormsCookieName,encryptedTicket);                                           
             Response.Cookies.Add(authCookie);                               
             Response.Redirect(
"manage/index.aspx");
             
         }
         
else
         {
             Response.Write(
"失败");
         }
     }

 

[]ASP.NET2.0提供了一套建立在Membership API之上的实现用户管理的控件,包括登陆,注册,密码找回,密码修改等丰富功能,基本能满足大部分的简单的用户管理要求,用户可以在此基础上进行扩展,也可以直接操作Membership API,实现自己的这些模块。

我下过来Ludico之后将连接字符串从SQLEXPRESS数据库改成SqlServer2005开发版的数据库,然后直接把里面的数据库附加上去,按照上面的方法配置身份验证。结果不知道什么原因老是出错。浪费了大把时间,下了半天断点还是百思不得其解。郁闷之中监视了一下身份的Roles类,因为这个类是系统提供的,根本没想过会出错,但是它的n层成员下居然看到了连接字符串"datasource=.\SQLEXPRESS;IntegratedSecurity=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"大家看它隐藏很深。

   奇怪的是它是哪里来的,因为很清楚web.config文件里不可能有,我搜了整个项目,居然还是没有。看了一下iis下的其它虚拟目录下居然也有这个字符串(在虚拟目录的属性->asp.net->编辑配置中),找了下网站目录下的web.Config也没这个字符串啊。开解webconfig文件AspNetSqlMembershipProvider中有connectionStringName="Ludico" 指定了连接字符串啊。相信大家也都才到了在machine.config

   总之,浪费了n多时间我才发现machine.config中的

<remove name="AspNetSqlRoleProvider" />

    
<add connectionStringName="Ludico" applicationName="/" name="AspNetSqlRoleProvider"

     type
="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

   
</providers>

而直接从sourceforge下载过来web.config文件里面缺少这个节都是如果你直接用项目里的数据库的话数据库名又刚好吻合,又不会出错。害人啊!大家注意了……

 

posted on 2009-10-15 05:44  老陈  阅读(702)  评论(1)    收藏  举报