internal static string Encode(AnonymousIdData data) { if (data == null || string.IsNullOrWhiteSpace(data.AnonymousId)) { return(null); } byte[] bufferId = Encoding.UTF8.GetBytes(data.AnonymousId); byte[] bufferIdLenght = BitConverter.GetBytes(bufferId.Length); byte[] bufferDate = BitConverter.GetBytes(data.ExpireDate.ToFileTimeUtc()); byte[] buffer = new byte[12 + bufferId.Length]; Buffer.BlockCopy(bufferDate, 0, buffer, 0, 8); Buffer.BlockCopy(bufferIdLenght, 0, buffer, 8, 4); Buffer.BlockCopy(bufferId, 0, buffer, 12, bufferId.Length); return(Base64UrlEncoder.Encode(buffer)); }
public void HandleRequest(HttpContext httpContext) { string encodedValue; bool isAuthenticated = httpContext.User.Identity.IsAuthenticated; DateTime now = DateTime.Now; // Handle secure cookies over an unsecured connection if (cookieOptions.Secure && !httpContext.Request.IsHttps) { encodedValue = httpContext.Request.Cookies[cookieOptions.Name]; if (!string.IsNullOrWhiteSpace(encodedValue)) { httpContext.Response.Cookies.Delete(cookieOptions.Name); } // Adds the feature to request collection httpContext.Features.Set <IAnonymousIdFeature>(new AnonymousIdFeature()); return; } // Gets the value and anonymous Id data from the cookie, if available encodedValue = httpContext.Request.Cookies[cookieOptions.Name]; AnonymousIdData decodedValue = AnonymousIdEncoder.Decode(encodedValue); string anonymousId = null; if (decodedValue != null && !string.IsNullOrWhiteSpace(decodedValue.AnonymousId)) { // Copy the existing value in Request header anonymousId = decodedValue.AnonymousId; // Adds the feature to request collection httpContext.Features.Set <IAnonymousIdFeature>(new AnonymousIdFeature() { AnonymousId = anonymousId }); } // User is already authenticated if (isAuthenticated) { return; } // Don't create a secure cookie in an unsecured connection if (cookieOptions.Secure && !httpContext.Request.IsHttps) { return; } if (string.IsNullOrWhiteSpace(anonymousId)) { // Creates a new identity anonymousId = Guid.NewGuid().ToString(); // Adds the feature to request collection httpContext.Features.Set <IAnonymousIdFeature>(new AnonymousIdFeature() { AnonymousId = anonymousId }); } else { // Sliding expiration is not required for this request if (!cookieOptions.SlidingExpiration || (decodedValue != null && decodedValue.ExpireDate > now && (decodedValue.ExpireDate - now).TotalSeconds > (cookieOptions.Timeout * 60) / 2)) { return; } } // Resets cookie expiration time cookieOptions.Expires = DateTime.UtcNow.AddSeconds(cookieOptions.Timeout); // Appends the new cookie AnonymousIdData data = new AnonymousIdData(anonymousId, cookieOptions.Expires.Value.DateTime); encodedValue = AnonymousIdEncoder.Encode(data); httpContext.Response.Cookies.Append(cookieOptions.Name, encodedValue, cookieOptions); }