Windows CardSpace – Kom igång!

Windows CardSpace är en del av .NET Framework 3.0 och som gör det möjligt att ha inloggning som inte kräver användarnamn och lösenord, utan låter användaren själv tillhandahålla det som krävs. Jag kommer inte att gå in djupare på vad det går ut på, utan refererar till en artikel som jag skrev för att tag sedan på Aspsidan.

För att kunna tillhandahålla Windows CardSpace-inloggning på sin hemsida så finns inga speciella krav på servern, utan det lämnas åt klienten. Det som krävs av servern är att den levererar HTML, medan klienten behöver en Identity Selector – ett tillägg som gör det möjligt att välja ett InfoCard som skall skickas in. Om användaren har Windows Vista eller Windows Server 2008 så har denne redan allt som behövs då det innehåller .NET Framework 3.0 som standard. Windows CardSpace finns även för Windows Server 2003 samt Windows XP. Jag kommer i den här bloggposten att gå igenom det som krävs för att du på ett så enkelt sätt som möjligt skall kunna hämta information från användaren genom ett InfoCard.

Windows CardSpace stöder som standard enbart Internet Explorer 7 och senare, men det är möjligt att med plugins till andra webbläsare även komma åt sin Identity Selector från dem. För andra operativsystem så finns det tredjepartsprodukter som agerar Identity Selector. Jag kommer i den här bloggposten att använda .NET Framework 3.5 som till skillnad från .NET Framework 3.0 tillåter postning av InfoCards även över HTTP, och inte bara HTTPS för enkelhetens skull. Om det skall användas på en publik sida så rekommenderar jag starkt att HTTPS används för att säkra att informationen som skickas inte kan sniffas upp utav andra personer. När användaren postar ett InfoCard över HTTP så postas en XML-fil i klartext med information från användaren, men om den skickas över HTTPS så blir den automatiskt krypterad.

Det jag vill göra nu är att på ett snabbt och enkelt sätt plocka fram användarens e-postadress genom att denne skickar in ett InfoCard.

Det första vi gör är att skapa upp ett InfoCard med information som skall kunna användas. Det kan till exempel se ut som nedan:

1

Informationen jag har angivit är denna:

2

Nästa steg är att skapa upp en sida med en knapp som besökaren kommer att kunna klicka på när denne vill välja vilket kort som skall publiceras. Det vi kommer att behöva för att öppna upp formuläret är dels en knapp som användaren skall klicka på och sedan ett objekt av typen “application/x-informationcard” och som innehåller information om vad vi vill göra. Det vi skall göra är att skriva ut just vilken e-postadress som finns i kortet och skippa all annan information som vi kan få ut då den är överflödig. Enligt Kim Camerons identitetslagar så skall man aldrig efterfråga mer information än nödvändigt.

Till skillnad från vad de flesta jag har talat med tror så är det väldigt lite kod som krävs på klienten för att man skall kunna använda sig utav Windows CardSpace. Koden nedan är den jag använder mig utav för att visa en knapp på sidan som kommer att hämta information från Windows CardSpace och sedan posta datan:

<form id="form1" runat="server">
    <input type="submit" value="Öppna Card Selector!" />
    <object type="application/x-informationcard" name="xmlToken">
        <param name="tokenType" value="urn:oasis:names:tc:SAML:1.0:assertion" />
        <param name="requiredClaims" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" />
    </object>
</form>

Det som visas på sidan är en knapp med texten “Öppna Card Selector”, och när användaren sedan klickar på den så öppnas Card Selectorn som bör visa det här:

3

Då det skickas över HTTP så kommer en liten varningstext upp som säger att informationen inte skickas krypterad. Som jag har nämnt tidigare så bör den alltid vara krypterad när den skickas på en publik hemsida. När vi sedan klickar på “Send” så postas en XML-fil till klienten med bland annat informationen som vi har efterfrågat.

Genom att plocka fram det som har postats i Request.Form[“xmlToken”] (namnet på objekt-taggen som används av Windows CardSpace) så kan vi enkelt plocka fram XML-filen och komma åt informationen. XML-filen som har postats bör se ut på detta sätt:

<saml:Assertion MajorVersion="1" MinorVersion="1" AssertionID="SamlSecurityToken-43943541-e473-402a-9a7b-1a3f73f98cfc" Issuer="http://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self" IssueInstant="2008-09-08T20:48:42.359Z" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
  <saml:Conditions NotBefore="2008-09-08T20:48:42.359Z" NotOnOrAfter="2008-09-08T21:48:42.359Z">
    <saml:AudienceRestrictionCondition>
      <saml:Audience>http://localhost:1061/CardSpace.aspx</saml:Audience>
    </saml:AudienceRestrictionCondition>
  </saml:Conditions>
  <saml:AttributeStatement>
    <saml:Subject>
      <saml:SubjectConfirmation>
        <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
      </saml:SubjectConfirmation>
    </saml:Subject>
    <saml:Attribute AttributeName="emailaddress" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
      <saml:AttributeValue>mikael@example.com</saml:AttributeValue>
    </saml:Attribute>
  </saml:AttributeStatement>
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod>
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod>
      <Reference URI="#SamlSecurityToken-43943541-e473-402a-9a7b-1a3f73f98cfc">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform>
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform>
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod>
        <DigestValue>ObUgD6FXvRke96vvuP5yi9XeO5E=</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>nC2zgK5etRFHgkOQkM2l/eGGbQdJRf1mk+lqp4akbB2+VjWsTCm1lffdJdvLWxBaaAeCO9S0HqPiVz4ZYxhzofnTrvgrhipn5E86m2r1VzgP7o8fdHEneCgo+zUo2NV77gfoKT4pvEAjMsOlSlZ8UcpOaIpfAyHY+WheT2p2Xsxv++rPF8Y8CjnmKJZcCikZeO4GbBAyilbUy3kGWDo4WbL3mu5v6gd3pUDsw84ImKhEMxfye7HVHQ8cushUeRa3o1aPxp6gCZ6g9VtHDneXrU+rfEkHWkWv83a7WyTrJqCs0z3opYeOlEckrCwwFr1/bzxW1X/e00BcKP67RKe5fg==</SignatureValue>
    <KeyInfo>
      <KeyValue>
        <RSAKeyValue>
          <Modulus>x4WIPNQtZTP9fOfI5Itvr1jqZFTl0yYVLptNo3OzC7W2lx8Vi9Mq3yVpxi7UstzG9GoBlye2Zj7mXFqq06o30+xCY6H0hJIqEJMqoSHkqCl/acgRHREeXpG4mvIGgjn96gVr9Ayy9PLTCQRHR1w+yap4abM1o0fdNIuDTO9Tl+Vkbv3D3et9cAjSFIfq31yUUyfE3jvSvsIGqjkLh4gt9B1KbfSohcy/TJQbFWi+J/G5Au5ZnEka99hVaUvfi4zT9s+Vh10ivUnPpSZTslyZPa+7xgTJMrYoGIsvVPk8u4gs6yoweenfkCXX+GRZJg3JjEngvybtf2qElN5r5iXO/w==</Modulus>
          <Exponent>AQAB</Exponent>
        </RSAKeyValue>
      </KeyValue>
    </KeyInfo>
  </Signature>
</saml:Assertion>

Här kan vi se att e-postadressen finns under //saml:attribute/saml:AttributeStatement, vilket gör att vi med ett par rader enkelt kan få fram e-postadressen som skickades med:

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.Form["xmlToken"] != null)
        GetEmail();
}
 
private void GetEmail()
{
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(Request.Form["xmlToken"]);
    XmlNode node =
        doc.SelectSingleNode(
            "/saml:Assertion/saml:AttributeStatement/saml:Attribute[@AttributeName='privatepersonalidentifier']", GetNamespaces(doc));
    Response.Write(node.InnerText);
    Response.End();
}
 
private XmlNamespaceManager GetNamespaces(XmlDocument doc)
{
    XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable);
    nsManager.AddNamespace("saml", "urn:oasis:names:tc:SAML:1.0:assertion");
    return nsManager;
}

Det som sker efter att användaren har postat sitt InfoCard är att e-postadressen skrivs ut på skärmen.

Detta var en liten quickstart i hur det fungerar med Windows CardSpace, och koden som används i exemplena bör inte användas rakt av i produktion, utan bör ses som ett enkelt exempel på hur man på ett snabbt och enkelt sätt kan få fram information från ett InfoCard med hjälp av Windows CardSpace.

Jag kommer senare att gå igenom hur man kan använda informationen som skickas in för att kunna koppla ett InfoCard mot ett konto i ASP.NET Membership och på så sätt göra det möjligt att logga in på en sida utan att behöva skriva in användarnamn och lösenord.

3 Comments

Comments have been disabled for this content.