Azure AD Single Sign On with multiple environments (Reply URLs)

July 17, 2013 - asp-net-mvc azure azure-ad office365

As part of an effort to move some internal applications to the cloud (sorry, The Cloud™), I recently went through the process of implementing Azure AD single sign on against our Office365 tenant directory. Working through the excellent MSDN tutorial, I hit the following (where it was describing how to reconfigure Azure AD to deploy your app to production):

Locate the REPLY URL text box, and enter there the address of your target Windows Azure Web Site (for example, https://aadga.windowsazure.net/). That will let Windows Azure AD to return tokens to your Windows Azure Web Site location upon successful authentication (as opposed to the development time location you used earlier in the thread). Once you updated the value, hit SAVE in the command bar at the bottom of the screen.

Wait, what? This appears to imply  Azure AD can’t authenticate an application in more than one environment (eg if you want to run a production & test environment, or, I don’t know, RUN IT LOCALLY) without setting up duplicate Azure applications and making fairly extensive changes to the web.config. Surely there’s a better way?

I noticed that the current version of the Azure management console allows for multiple Reply URL values: Azure AD Reply URLs

However, just adding another URL didn’t work - the authentication still only redirected to the topmost value.

The key was the \system.identityModel.services\federationConfiguration\wsFederation@reply attribute in web.config - adding this attribute sent through the reply URL and allowed authentication via the same Azure AD application from multiple environments, with only relatively minor web.config changes.

As the simplest solution, here’s an example Web.Release.config transform - more advanced scenarios could involve scripting xml edits during a build step to automatically configure by environment.

<system.identityModel.services>
  <federationConfiguration>
    <wsFederation reply="<<your prod url>>" xdt:Transform="SetAttributes" />
  </federationConfiguration>
</system.identityModel.services>