根据 Microsoft 的 ProfileInfo 定义http://msdn.microsoft.com/en-us/library/system.web.profile.profileinfo.aspx,未经身份验证的 profileinfo 对象具有用户名;自然,这必须关闭以在给定会话中保留/引用配置文件信息(我假设它是基于会话的)。我猜这是一些指南或其他东西,但我看不到它是在哪里定义、创建、跟踪等的。有人能指出我正确的方向吗?
1 回答
嗯...这个问题让我很感兴趣,所以我决定做一些研究。
在文档中进行一些挖掘后,我首先看到了实现配置文件提供程序MSDN 文章,在那里我发现了以下内容:
GetPropertyValues 方法
将 SettingsContext 和 SettingsPropertyCollection 对象作为输入。
SettingsContext 提供有关用户的信息。您可以使用该信息作为主键来检索用户的配置文件属性信息。使用 SettingsContext 对象获取用户名以及用户是经过身份验证的还是匿名的。...
因此,用户是否通过身份验证的确定通常在更高级别上进行。反正我看了一下微软默认的SqlProfileProvider实现(即GetPropertyValues
方法实现)的代码,发现它调用的方法private void GetPropertyValuesFromDatabase(string userName, SettingsPropertyValueCollection svc)
实际上有以下代码:
HttpContext context = HttpContext.Current;
...
string sName = null;
if (context != null)
sName = (context.Request.IsAuthenticated ? context.User.Identity.Name : context.Request.AnonymousID);
因此,如果我们有一个未经身份验证的请求,那么用户 ID 将从HttpContext.Current.Request.AnonymousID
属性中获取。在 MSDN 中搜索此属性会显示以下页面:HttpRequest.AnonymousID property (System.Web)。虽然它仍然没有描述生成此 ID 的确切算法,但它提供了有关如何根据需要覆盖此默认算法的信息。您所需要的只是public void AnonymousIdentification_Creating(Object sender, AnonymousIdentificationEventArgs e)
在您的 Web 应用程序中重载方法。此页面还提供了一些关于如何在调用之间保留 AnonymousID 的信息(默认情况下它存储在.ASPXANONYMOUS
cookie 中)。
示例代码:
void Application_Start(Object sender, EventArgs e)
{
// Initialize user count property
Application["UserCount"] = 0;
}
public void AnonymousIdentification_Creating(Object sender, AnonymousIdentificationEventArgs e)
{
// Change the anonymous id
e.AnonymousID = "mysite.com_Anonymous_User_" + DateTime.Now.Ticks;
// Increment count of unique anonymous users
Application["UserCount"] = Int32.Parse(Application["UserCount"].ToString()) + 1;
}
摘要:我无法回答您关于默认情况下如何创建此 ID 的原始问题,但我认为最后一个代码片段足以让您用任何您想要的算法覆盖它。