Ну ... Вопрос заинтересовал меня, поэтому я решил провести небольшое исследование.
Небольшое копание в документации привело меня сначала к Реализация поставщика профилей Статья 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
. В результате поиска этого свойства в MSDN была обнаружена следующая страница: Свойство HttpRequest.AnonymousID (System.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;
}
Резюме: Я не смог ответить на ваш первоначальный вопрос о том, КАК этот идентификатор создан по умолчанию, но я думаю, что вам будет достаточно последнего фрагмента кода, чтобы переопределить его любым алгоритмом, который вы захотите.