• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NET 2.0 及MVC下实现匿名用户向注册用户的迁移(上)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
演示环境:Win2003 + Visual Studio 2005 + Sql Server2005,前期需要将MS在Sql2000下的例程数据库Northwind加入Sql Server 2005;注意:操作系统不一定非要Win2003,凡是支持.net FrameWork 2.0的都可
 
新建一个例程网站,该网站目前结构如下图:
          
这是一个还未使用任何用户管理技术的网站,那么我们下面就从头开始讨论这些技术.
前期页面准备工作如下:
Default.aspx前后台代码如下:

Login页面的前后代码如下:


    <title>示例13-3</title>
    
<link id="InstanceStyle" href="StyleSheet.css" type="text/css" rel="stylesheet">
</head>
<body>
    
<form id="form1" runat="server">
        
<div>
            
<fieldset style="width: 260px">
                
<legend class="mainTitle">站点登录</legend>
                
<br />
                
<style="font-size: small">提示:用户名是Tom,密码是[email protected]</p>
                
<asp:Login ID="Login1" runat="server" Font-Size="Small" LoginButtonText="提交" PasswordLabelText="密码:" TitleText="" UserNameLabelText="用户名:" FailureText="输入不正确." RememberMeText="下次自动登录">
                    
<TextBoxStyle Width="150px" />
                    
<TitleTextStyle Font-Bold="True" />
                    
<CheckBoxStyle HorizontalAlign="Right" />
                
</asp:Login>
            
</fieldset>
        
</div>
    
</form>
</body>
</html>

Login页面没有后台代码,该页面需要用到一个成员用户管理类别的控件:Login1,请注意

以上就是页面上主要两个页面的设计情况,再就是些样式设计StyleSheet.css和Web.config如下:

</configuration>

注意:以上数据库连接字符串需要自己配置,这里配置是Windows登录,而且Data Source根据每台机器自己配置。

以上由Web.Config可以看出,此时页面验证方式是Forms。

此时运行Default.aspx页面是可以出现下图左边购物车的数据,该数据来自Northwind数据库,因为界面上通过SqlDataSource控件进行数据沟通的,如下两个图

此时在登录界面(Login.aspx)进行登录是无法实现的,因为此时未引入Profile概念,那么此概念将在下面介绍。

ASP.NET 2.0在处理用户配置信息方面基本抛弃了ASP.NET 1.X的做法,其提供的个性化用户配置功能可以实现将用户配置信息与单个用户关联,并采取持久化方式存储信息。理解这个概念需要注意以下四点:一是配置信 息可以是与任何用户有关的信息。二是所存储的信息可以是可以是任何数据类型的对象,比如甚至可以是复杂的自定义数据类型。三是单个用户可以是注册用户,也 可以是匿名用户。四是默认情况下,持久存储采用SQL Server数据库方式,并且无需自行创建或维护数据库,这些工作都有ASP.NET 2.0自动完成。

使用个性化用户配置功能主要包括如下两个核心的步骤:首先,配置应用程序以便启用和定义要为 用户存储和跟踪的配置信息。这些工作在Web.config文件的<Profile>中轻松完成。然后,使用与用户配置功能有关的强类型 API实现对用户配置信息的存储、访问和管理等。

那么,下面先来配置Web.config文件,加入如下代码:

11    <profile>
12      <properties>
13        <add name="ShoppingCart" type="ShoppingCart" serializeAs="Binary" allowAnonymous="true"/>
14      </properties>
15    </profile>
16    
17        <authentication mode="Forms">
18            <forms loginUrl="Login.aspx"></forms>
19        </authentication>
20        
21        <compilation debug="true"/>
22    </system.web>
23</configuration>

注意:上述红色部分代码(10~15行)是新加入的配置节

10行:标注是否需要对匿名用户进行身份记录

Profile 节包括<properties>和<providers>两大子配置节,我们先看<properties>,13行 此处是我们准备存储的ShoppingCart类,这个类用来记录购物车信息,type="ShoppingCart" 就是指向待会建立的类名叫ShoppingCart,后面二个属性表明这个类是可序列化为二进制,并且运行匿名用户访问的。

下面在App_Code目录下建立ShoppingCart类,代码如下:

}

 这个类需要我们了解非泛型集合哈希表的用法。

编译并运行后,点击登录按钮,按照提示进行登录操作,当然此时无法登录成功,因为我们还未配置用户名,然而经过此次不成功的登录并退出后,马上会发 现在App_Data目录中ASP.NET 2.0已经为我们建立了一个名为ASPNETDB.mdf的数据库。那么我们此时可以建立"Tom"这个用户了,步骤如下:

1.单击"网站"菜单下的"ASPNET配置"子菜单,弹出如下界面:

 

点击"安全"->"创建用户",并按照刚才未登录成功的提示用户和密码创建这个用户,其他信息自己随便填写。

创建好的用户现在有一个了,注意此时还未启用角色管理,如图:

双击ASPNETDB.MDF数据库,打开里面的ASPNET_USERS表,会发现现在多了一个刚注册的用户。

那么现在开始构建购物车相关代码,以上Default.aspx.cs中代码无需变动,只需将ProductGrid和CartGrid这两个GridView控件设置各自的OnSelectedIndexChanged事件分别指向AddCartItemRemoveCartItem方法,用于分别加入购物车和从购物车删除功能。请看如下两个代码片段:

   <asp:GridView ID="ProductGrid" runat="server" OnSelectedIndexChanged="AddCartItem"
                                Width="300px" AllowPaging="True" AutoGenerateColumns="False" BackColor="White"
                                BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" CellPadding="4" DataKe............

  <asp:GridView ID="CartGrid" AutoGenerateColumns="False" DataKeyNames="ID" OnSelectedIndexChanged="RemoveCartItem"
                                CellPadding="4" Width="320px
" runat="Server" BackColor="White" BorderColor="#CC9966"................

现在Default页面的后台代码如下:

}

现在我们在Default.aspx.cs中可以使用profile这个类了,因为我们在Web.config中已经加入了Profile配置节的定义了。

再次编译运行,我们会发现可以开始在匿名身份下进行购物车的商品添加操作了,我们加入一个商品,并退出, 待下次重新用匿名身份运行时,仍然能看到以前购物车里选择的商品。那么此时ASP.NET 2.0真正把匿名用户当一个状态用户来保存了,那么这些信息存在哪儿呢?答案就在ASPNETDB数据库的表aspnet_Profile表中,我们可以 看到最近这个匿名用户登录的情况,并且在PropertyNames字段可以看到购物车信息。注意:此时ASP.NET 2.0为这个匿名用户生成了唯一的UserId,并且在ASPNET_Users表中此UserId也生成了另一条记录,这两个表通过这个字段关联的,可 见,ASP.NET 2.0已经把这个匿名用户同刚才注册用户"Tom"都当作用户来管理了,但区别是两者在ASPNET_Users表中 IsAnonymous(是否是匿名用户)字段值是不同的。

 

再次运行网站,仍然看到匿名用户的购物信息,但此时点击"登录"按钮进入登录页面 (Login.aspx),输入正确的用户名和密码,如果都正确,界面上Login控件所在的"提交"按钮会自动关联ASPNETDB数据库,进行登录验 证,所以Login页面无需任何代码。那么此时当输入用户名密码都正确后,进入购物车页面,会发现,匿名用户变成了注册用户名,然而,刚才匿名购物的信息 没有了,也就是此时购物车是空的。按理说,匿名用户登录成功后,应该把购物信息带入到注册用户中去,这就是所谓的匿名用户的迁移问题!但此时无法实现,其实还有最后一道代码编写任务,那就是:

           在网站下新建一个全局应用程序类---Global.asax,去掉所有代码并写入如下代码:

 

加入上述代码后,,再次运行并登录成功,会发现匿名用户的购物信息已经迁移到注册用户这边来了,那么我们的目的也达到了。下面是对上述代码的详细解释:

Profile_MigrateAnonymous事件:

     当用户以匿名身份选择商品,并通过登录站点成为注册用户过程中,会引发一个重要的事件MigrateAnonymous,该事件的处理程序是Profile_MigrateAnonymous。 

  

ProfileCommon 类解释:

在运行时,ASP.NET 编译系统使用 profile 节中指定的信息生成一个名为 ProfileCommon 的类,该类派生自 ASP.NET 配置文件属性

 

小结:经过上述步骤,可以将一个未使用任何用户管理的网站利用ASP.NET 2.0内置的功能配置成用户管理模式。关键是理解Profile配置节的功能以及匿名用户迁移代码的写法。

问题思考:那么上述自动生成的数据库是否能在SQL Server2005中找到呢?现在还只是实现了用户的管理,那么权限管理怎么做?这些问题将在下篇中介绍。

摘自  http://www.cnblogs.com/Rogerliu/archive/2008/08/30/1279847.html

本文作者写的比较详细了     更多请参考 http://msdn.microsoft.com/zh-cn/library/d8b58y5d%28v=VS.80%29.aspx

附:

MVC下实现匿名用户向注册用户的迁移

添加头文件

using System.Web.Profile;
using System.Web.Security;

        void Profile_MigrateAnonymous(Object sender, ProfileMigrateEventArgs pe)
        {
            //获取匿名用户的Profile对象
            ProfileBase profileBase = ProfileBase.Create(pe.AnonymousID);
            //获取当前用户的Profile对象
            ProfileBase profile = HttpContext.Current.Profile as ProfileBase;
            if (profileBase.GetPropertyValue("ShoppingCart") != null)
            {
                profile.SetPropertyValue("ShoppingCart", profileBase.GetPropertyValue("ShoppingCart"));
            }
            //删除匿名用户的用户数据(从aspnet_Users表)

            Membership.DeleteUser(pe.AnonymousID);
            //删除匿名用户的Profle数据(从aspnet_Profile表)
            ProfileManager.DeleteProfile(pe.AnonymousID);
            //删除匿名用户标识
            AnonymousIdentificationModule.ClearAnonymousIdentifier();
        }


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap