Как получить AnonymousID из файла cookie ASPXANONYMOUS?
-
21-09-2019 - |
Вопрос
Если я посмотрю на свое значение cookie .ASPXANONYMOUS, это строка, т.е.
WZnX-rXHygeEkaAAAAOTFhZjE5YTctZmEzZi00MTMwLWEwNTatYjYwMzI0N2M0NTY4gQUSRlThiJWAjBgmBnpeIba7eGo1
Значение Request.AnonymousID является Guid.
Как перейти от ASPXANONYMOUS к AnonymousID?
Мне это нужно для устранения некоторых проблем с FormsAuthentication.
Решение
Да, анонимный идентификатор — это GUID.Строка cookie представляет собой зашифрованное значение, содержащее идентификатор и другие данные:
[Serializable]
internal class AnonymousIdData
{
internal string AnonymousId;
internal DateTime ExpireDate;
internal AnonymousIdData(string id, DateTime dt);
}
По умолчанию анонимные файлы cookie действительны в течение 90 дней и обновляются при каждом посещении.
Вы можете рассматривать Request.AnonymousID как имя пользователя запроса, если Request.IsAuthenticated==false.
видеть АнонимныйИдентификационныйМодуль
ОБНОВЛЯТЬ:В ответ на комментарий да, можно расшифровать значение, но зачем?
string aId = Request.AnonymousID;
string anonCookieValue = Request.Cookies[".ASPXANONYMOUS"].Value;
MethodInfo method = typeof(AnonymousIdentificationModule).GetMethod("GetDecodedValue", BindingFlags.Static | BindingFlags.NonPublic);
object anonymousIdData = method.Invoke(null, new object[] { anonCookieValue });
var field = anonymousIdData.GetType().GetField("AnonymousId", BindingFlags.Instance | BindingFlags.NonPublic);
string anonymousId = (string) field.GetValue(anonymousIdData);
field = anonymousIdData.GetType().GetField("ExpireDate", BindingFlags.Instance | BindingFlags.NonPublic);
DateTime expired = (DateTime) field.GetValue(anonymousIdData);
// why? just use Request.AnonymousID
Debug.Assert(aId == anonymousId);