Branding your services can be very important for many reasons where recognizability and company profile are the most common ones. Making the marketing department happy is not a bad thing either.
With ADFS in Server 2016, the capability to do branding on a relying party basis was added. This was something that you in 2012 R2 needed to use JavaScript to achieve. Please note that the customizations in this post works both in 2012R2 and 2016.
While the default branding options above fit most customer needs, I recently had a customer case where two municipalities were onboarding to Office 365. Since they were sharing the same AD domain, they also shared their ADFS environment. You can probably guess where we are going now… They want continue using the same ADFS environment but have different branding depending on the login domain in Office 365 / Azure AD. I have got this request before, but have usually talked out the customers of going that path and instead agree upon common branding, but not this time. Not the most evergreen solution, but all for the customers, right? 🙂
There is a uservoice for the same request using managed domains directly in Azure AD – so clearly this is not the first time this has come up.
OVERVIEW
We will customize onload.js to apply different branding depending on the Office 365 / Azure AD domain used to login.
If browsing /idpinitiatedsignon directly or using another RP than Azure AD/Office 365, the default branding should apply. In my example, I will use the domains dom1.365lab.net and dom2.365lab.net. I assume that basic branding/webtheme already is in place.
The branding will apply in the following scenarios:
- Being redirected from Azure AD (portal.office.com, portal.azure.com, the apps etc.) typing in the username.
- Browsing http://outlook.com/dom1.365lab.net directly.
- Browsing https://login.microsoftonline.com/?whr=dom1.365lab.net directly.
UPLOAD LOGO AND ILLUSTRATION
Upload the logos and illustrations as in my example script below. For performance and looks, follow the recommendation on sizes etc. on this TechNet page. If you have many domains, using some kind of naming convention might also be a good idea ;-).
$WebThemeName = "365lab" #The pictures to upload $UploadData = @{ logo = @('C:\temp\Branding\dom1.365lab.net_logo.png', 'C:\temp\Branding\dom2.365lab.net_logo.png') illustration = @('C:\temp\Branding\dom1.365lab.net_illustration.jpg', 'C:\temp\Branding\dom2.365lab.net_illustration.jpg') } #Loop through the image HT and upload the files accordingly foreach ($ImageType in $UploadData.Keys) { $UploadData[$ImageType] | ForEach-Object -Process { $FileName = $_.Split('\')[-1] Set-AdfsWebTheme -TargetName $WebThemeName ` -AdditionalFileResource @{ Uri = '/adfs/portal/{0}/{1}' -f $ImageType,$FileName Path = $_.ToString() } } }
CUSTOMIZATION OF ONLOAD.JS
The JavaScript basically loops through an array and checks if the request has been referred from any of the domains in scope for customizations. In the example, the username placeholder and the login message are customized based on the “domainconfig” data as well. If you don’t know how to export/import onload.js to ADFS, looking in to this article prior doing any changes might be a good idea.
//Variables var locationUrl = window.location.href.toLowerCase(), referrerUrl = document.referrer.toLowerCase(), logoDomain = document.getElementById('header'), loginMessage = document.getElementById('loginMessage'), userNameInput = document.getElementById('userNameInput'), domainconfig = [ {domain:"dom1.365lab.net", companyName: "365lab Domain 1", logo:"dom1.365lab.net_logo.png", illustration:"dom1.365lab.net_illustration.jpg"}, {domain:"dom2.365lab.net", companyName: "365lab Domain 2", logo:"dom2.365lab.net_logo.png", illustration:"dom2.365lab.net_illustration.jpg"} ]; function checkUrlForDomain(domainName) { return locationUrl.indexOf(domainName) > -1 || referrerUrl.indexOf(domainName) > -1; } for (var j = 0; j < domainconfig.length; j++){ var domainName = domainconfig[j].domain; if (checkUrlForDomain(domainName)) { var logo = domainconfig[j].logo; var illustration = domainconfig[j].illustration; var companyName = domainconfig[j].companyName; //for troubleshooting purposes //console.log(domainName); //console.log(logo); //console.log(illustration); //Change Logo logoDomain.innerHTML = "<img class='logoImage' src='/adfs/portal/logo/" + logo +"' alt='" + domainName + "'" +">" //Change illustration document.getElementsByTagName('style')[0].innerHTML = ".illustrationClass {background-image:url(/adfs/portal/illustration/" + illustration + ");}"; //Change login message loginMessage.innerHTML = "<h2>Sign in with your " + companyName + " account </h2>" ; //Change username placeholder userNameInput.placeholder = "firstname.lastname@" + domainName ; } }
After updated onload.js with your code, upload the changes to your webtheme with the following PowerShell cmdlet.
$WebThemeName = "365lab" Set-AdfsWebTheme -TargetName $WebThemeName ` -AdditionalFileResource @{ Uri="/adfs/portal/script/onload.js" path="C:\temp\script\onload.js" }
RESULTS
Voila! We now have different branding in our ADFS depending on the domain suffix entered in Office 365 / Azure AD. Note that the code won’t change branding if you change the domain suffix in the username field after hitting the ADFS farm.
idpInitiatedSignOn
Browsing outlook.com/dom1.365lab.net
Browsing outlook.com/dom2.365lab.net
Good luck with your branding and as always, let me know if you have feedback!
Happy new year!
/Johan
Great Article!
Everything work fine except illustration does not get applied for me.I have checked everything many times but I can’t fix it.