Marcel's Blog

May 2012 - Posts

MEET Windows Azure on June the 7th

Windows Azure heb ik al op het oog sinds de CTP van de PDC’2008. Veel van mijn werkuren en daarbuiten zijn gevuld met Windows Azure! And I love it. Daarom het volgende.

Get ready to MEET Windows Azure live on June the 7th. Register to watch live (June the 7th 1PM PDT) here. Be informed by following the conversation @WindowsAzure, #MEETAzure, #WindowsAzure

And, if you want to be more social, register for the Social meet up on Twitter event, organized by fellow Azure MVP Magnus Martensson.

You don’t want to miss this event!

See you there!

MEET Windows Azure Blog Relay:

·         Roger Jennings (@rogerjenn): Social meet up on Twitter for Meet Windows Azure on June 7th

·         Anton Staykov (@astaykov): MEET Windows Azure on June the 7th

·         Patriek van Dorp (@pvandorp): Social Meet Up for ‘MEET Windows Azure’ on June 7th

·         Marcel Meijer (@MarcelMeijer): MEET Windows Azure on June the 7th

·         Nuno Godinho (@NunoGodinho): Social Meet Up for ‘MEET Windows Azure’ on June 7th

·         Shaun Xu (@shaunxu) Let's MEET Windows Azure

·         Maarten Balliauw (@maartenballiauw): Social meet up on Twitter for MEET Windows Azure on June 7th

·         Brent Stineman (@brentcodemonkey): Meet Windows Azure (aka Learn Windows Azure v2)

·         Herve Roggero (@hroggero): Social Meet up on Twitter for Meet Windows Azure on June 7th

·         Paras Doshi (@paras_doshi): Get started on Windows Azure: Attend “Meet Windows Azure” event Online

·         Simran Jindal (@SimranJindal): Meet Windows Azure – an online and in person event, social meetup #MeetAzure (+ Beer for Beer lovers) on June 7th 2012

·         Michael Wood (@mikewo): Learn about Windows Azure and Chat with Experts, June 7th

·         Shiju Varghese (@shijucv): Social meet up on Twitter for MEET Windows Azure on June the 7th

·         Jeremie Devillard (@jeremiedev): Meet the Cloud–Windows Azure Event 7th June

·         Kris van der Mast (@KvdM): Get ready to meet Windows Azure

·         Mike Martin (@TechMike2KX): Don’t miss the online Windows Azure event of the year : MEET Windows Azure on June 7th

·         Bill Wilder (@codingoutloud): Get ready to “Meet #WindowsAzure” in a live streamed event June 7 at 4:00 PM Boston time

·         Magnus Mårtensson (@noopman): Social meet up on Twitter for MEET Windows Azure on June 7th

Windows Azure + WIF + Access Control (ACS)

Als je gebruik gaat maken van de Access Control Service (ACS) op het Windows Azure platform, dan zijn er voldoende websites te vinden met een keurig stappenplan. Bijvoorbeeld hier. Hoewel er behoorlijk geconfigureerd moet worden, zowel in de applicatie als op de ACS website, is het goed te doen.

Als je vervolgens de gebouwde Windows Azure applicatie ook daadwerkelijk in de Cloud gaat laten draaien zijn er een aantal aha momenten. Hieronder een opsomming.

Het is wel handig om de website als SSL te maken.

1) De Windows Identity Foundation (WIF) runtime.

Op de standaard Windows Azure instances is de WIF runtime niet aanwezig. Uit verschillende discussie die ik gevolgd heb en eigen ervaring, blijkt dat een simpel ‘copy local’ van de WIF assembly (Windows.Identity.dll) niet voldoende. Je zult echt de WIF runtime moeten mee installeren met de installatie van de Windows Azure web applicatie.

Dat is relatief eenvoudig. Met behulp van het startup task mechanisme van Windows Azure kun je een batch file af starten en daarmee de runtime installeren. Deze runtime is te downloaden van hier. Er is zowel een x86 als x64 versie beschikbaar. De x64 heb je nodig voor het deployen naar Windows Azure. Afhankelijk van de gekozen OS Family (Windows 2008 of Windows 2008 R2) heb je de 6.0 of de 6.1 nodig. Ontwikkel je lokaal op Windows 7 of Windows 2008 R2 dan heb je ook 6.1 nodig.

In de ServiceDefinition.csdef van de WebRole voeg je het volgende stuk toe.  

   1:  <Startup>
   2:    <Task commandLine="startup.cmd" 
   3:               executionContext="elevated" 
   4:               taskType="simple">   
   5:    </Task>
   6:  </Startup>

Aan het webproject voeg je dan een file met de naam startup.cmd toe. Het makkelijkst is dat om in de root te doen. Anders moet je in de stap hierboven ook het path aangeven.

De startup.cmd bevat dan:  

   1:  REM WIF assembly 
   2:  sc config wuauserv start= demand 
   3:  wusa.exe "%~dp0Windows6.1-KB974405-x64.msu" /quiet /norestart
   4:  rem wusa.exe "%~dp0Windows6.0-KB974405-x64.msu" /quiet /norestart 
   5:  sc config wuauserv start= disabled

Bij het deployen van de applicatie wordt in een van de stappen ook de startup task uitgevoerd.

2) Multiple instances

Zoals bekend moet je op Windows Azure om aan de SLA te voldoen in elk geval 2 instanties van je Role starten. Van Windows Azure ACS krijg je een cookie. Deze cookie wordt geencryptd en gedecryptd.

Deze versleuteling vindt plaats met de machine-sleutel van de instantie waar je zat. Maar op de andere instantie is de machine-sleutel natuurlijk anders en dan kan het cookie niet gelezen worden door een andere instantie.

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. Om dit goed te laten verlopen moet je in de Global.asax.cs de FederatedAuthentication.ServiceConfigurationCreated methode toevoegen.

   1:  protected void Application_Start()   
   2:  {   
   3:      AreaRegistration.RegisterAllAreas();   
   4:  
   5:      FederatedAuthentication.ServiceConfigurationCreated 
   6:             += OnServiceConfigurationCreated;   
   7:  }   
   8:   
   9:  void OnServiceConfigurationCreated(object sender, 
  10:                        ServiceConfigurationCreatedEventArgs e)   
  11:  {  
  12:      // Use the <serviceCertificate> to protect the cookies 
  13:      // that are sent to the client.  
  14:      // so multiple roles do the same.  
  15:      if (e.ServiceConfiguration.ServiceCertificate == null)  
  16:         return;  
  17:   
  18:      Trace.WriteLine("ServiceCertif: ", 
  19:                 e.ServiceConfiguration.ServiceCertificate.Thumbprint);  
  20:      List<CookieTransform> sessionTransforms =  
  21:          new List<CookieTransform>(  
  22:              new CookieTransform[] {  
  23:                  new DeflateCookieTransform(),
  24:                  new RsaEncryptionCookieTransform
  25:                         (e.ServiceConfiguration.ServiceCertificate),  
  26:                  new RsaSignatureCookieTransform
  27:                         (e.ServiceConfiguration.ServiceCertificate)   
  28:              }  
  29:          );  
  30:   
  31:      SessionSecurityTokenHandler sessionHandler =   
  32:         new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());  
  33:   
  34:      e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(
  35:                 sessionHandler
  36:      );  
  37:  }

3) Realm

Op mijn demo site zijn alle pagina’s zichtbaar zonder in te loggen, maar mag je secret page pas benaderen na inloggen. In de default situatie na het doorlopen van de wizard zullen alle pagina’s niet benaderbaar zijn zonder in te loggen. Ik heb daarom dit gedeelte in de web.config uit gecommentarieerd.

   1:  <system.web>
   2:      <!--
   3:      <authorization>
   4:        <deny users="?" />
   5:      </authorization>
   6:      -->

Op de ACS portal heb ik de return URL laten verwijzen naar de pagina die bij mij geheim is.

acs3

Dat is deze pagina in de app.

acs2

ACS implementeren is eigenlijk heel makkelijk, maar toch weer heel lastig. Er zijn veel knoppen waar je aan moet draaien om het goed te laten werken.

Ander dingetje wat je je moet realiseren. Het Access Control mechanisme zoals Windows Azure die aanbiedt bestaat voor het grootste gedeelte uit alleen de authenticatie. Weet je het nog Authenticatie, ben jij degene die je zegt dat je bent; Autorisatie, wat mag jij of welke rollen heb jij op deze website / webapplicatie. Wat je met ACS uit handen geeft is de authenticatie. Door middel van de login/password bij een van de Identity providers.

acs1

De autorisatie moet je zelf uitwerken in je eigen website of webapplicatie. De claims die je van de identity providers terugkrijgt zijn tokens (alleen FaceBook), e-mail adressen (niet bij Windows Live), Name (niet bij Windows Live) en een nameidentifier. De nameidentifier kun je wel gebruiken als key voor je rollen toekenningen systeem. En zoals je voorgaande leest, wil je bij Windows Live zelf vragen om e-mail adres en name (of je gaat met de nameidentifier zelf te raden bij Windows Live wat natuurlijk ook kan).

Veel plezier met WIF, ACS en Windows Azure. Wil je mijn web.config bekijken, mail mij (marcelmeijer @ planet.nl) dan. Mijn demo site is https://cloudtest.marcelmeijer.net .

VS11 Beta + WIF

Met het uitkomen van Visual Studio 11 Beta is er ook een update gekomen van de Windows Identity Foundation (WIF) tools. De precieze details kun je natuurlijk beter verteld krijgen door Kaptein Identity (Vittorio Bertocci). Voor de Cloud cover aflevering zie http://blogs.msdn.com/b/vbertocci/archive/2012/03/16/the-wif-tools-for-visual-studio-11-beta-on-cloudcover.aspx

Maar ik heb er ook eens mee zitten spelen en het ziet er heel goed uit. Schreef ik in mijn vorige blogpost over ACS nog dat het veel configureren en draaien aan knoppen was, met deze toevoeging is dat toch nog simpelere geworden.

Aangezien er nog een Visual Studio 11 tools for Windows Azure zijn, zullen de komende schermprints betrekking hebben op een gewone Website.

clip_image002

In het context menu van een Webproject zit nu een menu item ‘Identity and Access’. Het startpunt om de Access control van je Website in te regelen. Na de keuze verschijnt er een scherm met een beperkt aantal keuzes.

clip_image003

Zo kun je kiezen voor een local development STS, ADFS2 of ACS. Op de twee andere tabbladen kun je dan de settings doen, die voor de gekozen provider van belang zijn. De inhoud van deze tabbladen is context gevoelig.

De local development STS hebben we node gemist in al onze WIF ontwikkeltrajecten. Als je deze kiest en je gaat naar het derde tabblad, dan zie je daar de waarden die de STS terug geeft aan je applicatie. Nu kun je je Website beter testen met de verschillende claims.

clip_image005 clip_image006

Als je de Website start in VS11, dan verschijnt er in de taskbar een LocalSTS tool.

clip_image007

En op je website zal het Login control keurig de naam laten zien uit het derde tabblad.

clip_image008

Ik heb (nog) geen ADFS2 omgeving tot mijn beschikking. Dus dat kan ik helaas niet verder laten zien. Maar wel een Windows Azure ACS omgeving en dat is al even makkelijk. Je geeft je ACS account gegevens op (namespace en management key). Vervolgens selecteer je welke Identity providers voor jouw applicatie relevant zijn. NB deze moet je wel eerst zelf hebben toegevoegd op de ACS administration page.

clip_image009 clip_image010

Nadat je OK geklikt hebt, ratelt er iets en zul je zien dat de web.config ineens allerlei verwijzingen naar je ACS bevat.

clip_image011

En als je runt, krijg je wat je verwacht.

clip_image012clip_image013

Op de ACS management portal zijn ook automatisch een aantal zaken aangepast en toegevoegd.

clip_image014

Geweldig toch! Oke, eea is nog niet helemaal compleet, want SSL kan nog niet via de schermen en er zullen vast nog meer dingen missen. Maar de richting is gezet en het ziet er goed uit.