Come si ottiene AnonymousID dal biscotto ASPXANONYMOUS?
-
21-09-2019 - |
Domanda
Se ho uno sguardo al mio CookieValue .ASPXANONYMOUS è una stringa cioè
WZnX-rXHygEkAAAAOTFhZjE5YTctZmEzZi00MTMwLWEwNTAtYjYwMzI0N2M0NTY4gQUsRlThiJWAjBgmBnpeIba7eGo1
Il valore Request.AnonymousID è un GUID.
Come si arriva da ASPXANONYMOUS a AnonymousID?
Ho bisogno di questo per eseguire il debug dei problemi che ho con FormsAuthentication.
Soluzione
Si, un ID anonimo è un GUID. La stringa di cookie è un valore criptato contenente l'ID e altri dati:
[Serializable]
internal class AnonymousIdData
{
internal string AnonymousId;
internal DateTime ExpireDate;
internal AnonymousIdData(string id, DateTime dt);
}
Per impostazione predefinita, i cookie anonimi sono validi per 90 giorni e vengono aggiornati ogni visita.
Si può trattare Request.AnonymousID come username richiesta al momento Request.IsAuthenticated == false.
UPDATE: In risposta a un commento, sì, è possibile decodificare il valore, ma perché?
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);