Windows Azure AppFabric ACS met meerdere instanties

Met Windows Azure AppFabric ACS had ik een mooie demo in elkaar gezet. Op deze simpele MVC2 site is een pagina Secret. Om deze pagina te kunnen bekijken moet je inloggen. Dat inloggen kon via alle mogelijke social networks, kortom alle Social networks die worden ondersteund door de Windows Azure AppFabric ACS. Dat had ik vrij snel in elkaar, via Bing zijn diverse stappenplannen te vinden.

Het enige dat toen nog niet werkte was het uit te loggen. De standaard Logout link op de Masterpage had niet het gewenste effect. Je werd als user niet uitgelogd. Na wat zoeken en hulp van oa Patriek van Dorp bleek dat ik een ander control moest gebruiken.

wifmulti2

(het uitgecommentarieerde stuk is de standaard code)

Daarna werkte mijn demo zoals ik mij had voorgesteld. Maar ik had van de webrole maar een instantie draaien. Nadat ik opmerkingen had gelezen over ACS met meerdere instanties, besloot ik mijn webrole ook op 2 instanties te laten draaien. En inderdaad, de demo deed het soms wel en soms niet. Niet zo vreemd bleek na het lezen van het book van Captain Identity Vittorio Bertocci. Je krijgt een cookie en deze is versleuteld met machine-sleutel van de instantie waar je zat. Maar op de andere instantie is de machine-sleutel natuurlijk anders en kan het cookie niet gelezen worden.

De oplossing is dan ook vrij simpel, zorg ervoor dat de versleuteling plaats vind met voor alle machines een gelijke sleutel. Ik heb voor mijn domein een SSL certificaat gekocht en deze kan ik daar mooi voor gebruiken.

In de code behind van de Global.asax zul je de Application_Start methode moeten aanpassen.

void Application_Start(object sender, EventArgs e)
{
     // Code that runs on application startup
     FederatedAuthentication.ServiceConfigurationCreated +=
OnServiceConfigurationCreated;
}

En je moet deze methode toevoegen. Deze methode zorgt uiteindelijk voor de versleuteling.

void OnServiceConfigurationCreated(
object sender,
ServiceConfigurationCreatedEventArgs e)
{
// Use the <serviceCertificate> to protect the cookies that are
// sent to the client.
So multiple roles do the same.
List<CookieTransform> sessionTransforms =
new List<CookieTransform>(
new CookieTransform[] {
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(
e.ServiceConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(
e.ServiceConfiguration.ServiceCertificate)
}
);

SessionSecurityTokenHandler sessionHandler =
new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());
e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(
sessionHandler);
}

Oke, zoals je ziet, wordt er in de ServiceConfiguration gekeken naar een Certificaat. Deze zul je in de Web.config dan nog wel even moeten toevoegen.

wifmulti1

Na al deze aanpassingen werkte de demo met meerdere instanties en alle Social networks. Hoe leuk is dat!

De demo is in zijn geheel te bekijken op https://cloudtest.marcelmeijer.net. Als je naar de Secret page gaat, dan wordt je Social Network ID opgeslagen in een database om te tellen hoevaak je naar deze Secret page gaat. Ik doe verder niets met deze informatie.

Published by

Marcel Meijer

Op dit moment houdt hij zich voornamelijk bezig met Microsoft Azure, Cloud, C#, Software Ontwikkeling, Architectuur, etc. Hij werkt als consultant voor zijn eigen bedrijf JOEP-IT bv. In zijn vrije tijd is hij voorzitter, bestuurslid, eindredacteur en eventorganisator bij de SDN (Software Development Network). Sinds 1 oktober 2010 is hij MVP.

Leave a Reply

Your email address will not be published. Required fields are marked *