ASP.NET 配置文件属性的用户标识
更新:2007 年 11 月
ASP.NET 用户配置文件功能设计为提供当前用户的独有信息。配置文件可由通过身份验证的用户使用,也可以由匿名(未经身份验证)用户使用。
通过身份验证的用户
默认情况下,用户配置文件与当前 HTTP 上下文(可通过 HttpContext.Current 属性访问)的 User 属性中存储的用户标识关联。用户标识可通过以下几方面确定:
ASP.NET Forms 身份验证系统,该系统在身份验证成功之后设置用户标识。
Windows 或 Passport 身份验证,此功能在身份验证成功之后设置用户标识。
自定义身份验证,对用户凭据的获取和用户标识的设置进行手动管理。
ASP.NET Forms 身份验证需要创建登录窗体并提示用户提供凭据。使用 ASP.NET 登录控件,无需编写任何代码即可创建登录窗体并执行 Forms 身份验证。有关使用 ASP.NET 功能对用户进行身份验证的信息,请参见 ASP.NET 登录控件概述 和 使用成员资格管理用户。有关 Forms 身份验证的信息,请参见如何:实现简单的 Forms 身份验证。
匿名用户
配置文件还可由匿名用户使用。默认情况下,并不会启用匿名配置文件支持,因此必须显式启用。此外,当在 Web.config 文件中定义配置文件属性时,必须将其显式定义为可由匿名用户单独使用。由于配置文件可能设计为由通过身份验证的用户使用,并且许多属性可能包含匿名用户不可用的个人信息,因此默认情况下配置文件属性并不支持匿名访问。
如果启用了匿名标识,则用户首次访问站点时,ASP.NET 将为其创建一个唯一标识。该唯一用户标识存储在用户计算机上的 Cookie 中,这样,对于每个页请求,其用户都可以得到标识。Cookie 的默认有效期设置为大约 70 天,当用户访问站点时会定期对其进行更新。如果用户的计算机不接受 Cookie,则可将该用户的标识作为请求的页 URL 的一部分来维护(尽管用户关闭浏览器时该标识会丢失)。
有关启用匿名标识的信息,请参见 anonymousIdentification 元素(ASP.NET 设置架构)。
迁移匿名配置文件信息
在有些情况下,您的应用程序最初可能维护着匿名用户的个性化设置信息,但最后该用户登录到了您的应用程序中。在这种情况下,该用户的标识会从分配的匿名用户标识更改为身份验证进程提供的标识。
当用户登录(即不再是匿名用户)时,将引发 MigrateAnonymous 事件。如果有必要,可以对此事件进行处理,以便将信息从用户的匿名标识迁移到新的通过身份验证的标识。下面的代码示例演示用户通过身份验证时如何迁移信息。
Public Sub Profile_OnMigrateAnonymous(sender As Object, args As ProfileMigrateEventArgs)
Dim anonymousProfile As ProfileCommon = Profile.GetProfile(args.AnonymousID)
Profile.ZipCode = anonymousProfile.ZipCode
Profile.CityAndState = anonymousProfile.CityAndState
Profile.StockSymbols = anonymousProfile.StockSymbols
''''''''
' Delete the anonymous profile. If the anonymous ID is not
' needed in the rest of the site, remove the anonymous cookie.
ProfileManager.DeleteProfile(args.AnonymousID)
AnonymousIdentificationModule.ClearAnonymousIdentifier()
' Delete the user row that was created for the anonymous user.
Membership.DeleteUser(args.AnonymousID, True)
End Sub
public void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs args)
{
ProfileCommon anonymousProfile = Profile.GetProfile(args.AnonymousID);
Profile.ZipCode = anonymousProfile.ZipCode;
Profile.CityAndState = anonymousProfile.CityAndState;
Profile.StockSymbols = anonymousProfile.StockSymbols;
////////
// Delete the anonymous profile. If the anonymous ID is not
// needed in the rest of the site, remove the anonymous cookie.
ProfileManager.DeleteProfile(args.AnonymousID);
AnonymousIdentificationModule.ClearAnonymousIdentifier();
// Delete the user row that was created for the anonymous user.
Membership.DeleteUser(args.AnonymousID, true);
}