Как должно выглядеть анонимное имя пользователя в объекте ProviderInfo? - PullRequest
1 голос
/ 29 декабря 2011

В соответствии с определением Microsoft ProfileInfo http://msdn.microsoft.com/en-us/library/system.web.profile.profileinfo.aspx, имя объекта профиля не прошедшей проверку подлинности имеет имя пользователя;естественно, это должно быть отключено для сохранения / ссылки на информацию профиля в данном сеансе (я предполагаю, что она основана на сеансе).Я предполагаю, что это какой-то указатель или что-то в этом роде, но я не вижу, где это определено, создано, отслежено и т. Д. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

2 голосов
/ 05 января 2012

Ну ... Вопрос заинтересовал меня, поэтому я решил провести небольшое исследование.

Небольшое копание в документации привело меня сначала к Реализация поставщика профилей Статья 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;
}

Резюме: Я не смог ответить на ваш первоначальный вопрос о том, КАК этот идентификатор создан по умолчанию, но я думаю, что вам будет достаточно последнего фрагмента кода, чтобы переопределить его любым алгоритмом, который вы захотите.

...