As we all know all DXP environments use Cloudflare as CDN. There are loads of functionality that Cloudflare provides out-of-the-box and GeoLocation header is one of them. Episerver enable this header by default in all DXP environments (https://world.episerver.com/
documentation/developer-guides/CMS/Deployment/content-delivery-network-cdn-configuration/)

episerver Geolocation of user

Why not MaxMind IP database?

Although Episerver provides us with a separate NuGet package called EPiServer.Personalization.MaxMindGeolocation that uses MaxMind GeoLite2 database but there are still advantages of using Cloudflare HTTP header such as

  • It’s always up-to-date
  • It does not base on a lite version
  • You can use it in client-side scripting & does not always need server-side scripting.
  • It’s lightweight as compared to finding a record in App hosted CSV file.

But there are few scenarios where you can not use http header

  • HTTP header just gives you visitor’s country ISO code. Unlike the MaxMind database, it does not give city information.

Visitor Group Criteria

Cloudflare Geo location Model

    [EPiServerDataStore(AutomaticallyCreateStore = true, AutomaticallyRemapStore = true)]
    public class CloudflareGeolocationModel : CriterionModelBase
    {
        [DojoWidget]
        public string CountryCode { get; set; }
        public override ICriterionModel Copy()
        {
            return ShallowCopy();
        }
    }

Cloudflare Geo location Criterion

    [VisitorGroupCriterion(
        Category = "Visitor Groups",
        DisplayName = "Cloudflare Geolocation",
        Description = "Geolocation based on Cloudflare HTTP header")]
    public class CloudflareGeolocationCriterion : CriterionBase<CloudflareGeolocationModel>
    {
        public override bool IsMatch(IPrincipal principal, HttpContextBase httpContext)
        {
            // uncomment if you want this Criterion to apply only to Authenticated users
            //if (principal == null || !principal.Identity.IsAuthenticated) return false;
            var geolocationHeader = httpContext.Request?.Headers["CF-IPCountry"];
            return Model.CountryCode.ToLower() == geolocationHeader.ToLower();
        }
    }

Source Code: The source code of this Episerver personalization criteria can be downloaded from this link.

Categorized in: