根据Microsoft的ProfileInfo定义http://msdn.microsoft.com/en-us/library/system.web.profile.profileinfo.aspx,未经身份验证的profileinfo对象具有用户名;当然,这必须在给定会话中保持/引用配置文件信息(我假设它是基于会话的)。我猜这是一些guid或者其他东西,但是我没有看到它的定义,创建,跟踪等等。有人能指出我正确的方向吗?
答案 0 :(得分:2)
嗯......这个问题让我感兴趣所以我决定做一些研究。
在文档中进行了一些挖掘,我首先找到了Implementing a Profile Provider MSDN文章,其中我发现了以下内容:
GetPropertyValues方法
将SettingsContext和SettingsPropertyCollection作为输入 对象
SettingsContext提供有关用户的信息。您可以使用 信息作为检索配置文件属性的主键 用户的信息。使用SettingsContext对象获取 用户名以及用户是否经过身份验证或匿名。 ...
因此,确定用户是否经过身份验证通常是在更高级别上进行的。无论如何,我看了一下Microsoft的默认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);
因此,如果我们有一个未经过身份验证的请求,则会从HttpContext.Current.Request.AnonymousID
属性中获取用户ID。在MSDN中搜索此属性已显示以下页面:HttpRequest.AnonymousID property (System.Web)。虽然它仍然没有描述生成此ID的确切算法,但它提供了有关如何根据需要覆盖此默认算法的信息。您所需要的只是在Web应用程序中重载public void AnonymousIdentification_Creating(Object sender, AnonymousIdentificationEventArgs e)
方法。此页面还提供了有关如何在调用之间保留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但我认为最后的代码段足以让您使用您想要的任何算法覆盖此ID