应该在ProviderInfo对象中看起来像什么是匿名用户名?

时间:2011-12-29 15:10:52

标签: asp.net asp.net-profiles

根据Microsoft的ProfileInfo定义http://msdn.microsoft.com/en-us/library/system.web.profile.profileinfo.aspx,未经身份验证的profileinfo对象具有用户名;当然,这必须在给定会话中保持/引用配置文件信息(我假设它是基于会话的)。我猜这是一些guid或者其他东西,但是我没有看到它的定义,创建,跟踪等等。有人能指出我正确的方向吗?

1 个答案:

答案 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

相关问题