Microsoft stellt offizielles CardSpace Logo vor

Monday, June 25, 2007 7:20:59 PM (W. Europe Daylight Time, UTC+02:00)

 Microsoft hat das offizielle Logo für Windows CardSpace vorgestellt. Das CardSpace Logo soll auf Webseiten eingesetzt werden, die eine Anmeldung mit CardSpace unterstützen. Anhand des Logos können Besucher der Seite sofort erkennen, dass eine Anmeldung mit CardSpace möglich ist.

Und so sieht es aus:

infocard_365x256

 

Die Anmeldeseite für mein Blog habe ich schon angepasst :).

 

Download: CardSpace Logo & Logo Guidelines

Kick it on dotnet-kicks.de

CardSpace Vorurteile

Wednesday, April 11, 2007 3:20:59 PM (W. Europe Daylight Time, UTC+02:00)

Wenn ich mit anderen Entwicklern über CardSpace spreche höre ich leider immer wieder die gleichen Vorurteile über CardSpace. Das kommt wohl daher, dass viele die CardSpace nicht kennen erstmal von Passport ausgehen und vermuten, dass CardSpace wohl so ähnlich sein muss. Dabei haben aber beide Technologien nichts miteinander zu tun, mal abgesehen davon, dass beide von Microsoft sind.

Einige dieser Vorurteile sind:

"Meine Daten werden bei Microsoft gespeichert"
Falsch! Bei CardSpace gibt es keine zentralen Server, die alle Daten des Anwenders speichern. Daten werden entweder lokal auf dem Rechner des Anwenders gespeichert (bei sogenannten selbstausgestellten Karten) oder auf dem Server eines Identitätsanbieters (bei verwalteten Karten). Im Prinzip kann jeder der das möchte ein Identitätsanbieter für CardSpace werden. Mögliche Identitätsanbieter könnten z.B. Banken, Universitäten, Vereine oder vielleicht sogar Behörden sein. Das hängt ganz davon ab, was man mit CardSpace mache möchte.

"CardSpace funktioniert doch nur mit dem Internet Explorer und Windows"
Falsch! CardSpace basiert auf offenen und freien Standards. Jeder der möchte, kann diese Standards selbst implementieren. So gibt es z.B. schon CardSpace Identity-Selektoren ("CardSpace UIs") für Firefox und Safari. Die Standards, auf denen CardSpace basiert sind z.B.: WS-Trust, WS-Security und SAML, um nur einige zu nennen.

"CardSpace funktioniert doch sicher nur mit ASP.NET Web Servern"
Falsch! CardSpace lässt sich problemlos mit beliebigen Web Servern und Webtechnologien nutzen, da es auf freien und offenen Standards basiert. Kim Cameron, einer der Architekten von CardSpace, hat z.B. CardSpace in sein Wordpress (PHP) Blog integriert.

"CardSpace in meine Webseite einbauen ist zu kompliziert"
Falsch! Je nachdem mit welcher Plattform man arbeitet gibt es bereits viele fertige Bibliotheken und Beispiele, die man nutzen kann, um CardSpace in eigene Webseiten zu integrieren. Am einfachsten geht das natürlich mit ASP .NET, dafür gibt es einfach schon die meisten Beispiele. Es gibt aber auch schon CardSpace Bibliotheken für PHP [1], [2] und Java. Mit solchen fertigen Beispielen und Bibliotheken lässt sich CardSpace mit wenigen Zeilen Code in eigene Webseiten integrieren. Auf Plattformen wo es solche Bibliotheken noch nicht gibt ist das natürlich wirklich aufwändiger. In dem Fall hängt es davon ab, wie gut die jeweilige Plattform die von CardSpace verwendeten Technologien unterstützt, insbesondere XML Encryption, XML Signaturen und SAML Tokens. Diese Arbeit muss aber für jede Plattform nur einmal von irgendjemandem gemacht werden. Früher oder später wird es für alle wichtigen Plattformen CardSpace Bibliotheken geben.

"CardSpace ist nicht kostenlos"
Falsch! Zumindest CardSpace selbst basiert auf offenen und frei verfügbaren Standards und kann somit ohne Lizenzgebühren verwendet werden. Allerdings benötigt CardSpace eine verschlüsselte Verbindung über HTTPS und somit SSL Zertifikate. Die sind aber gar nicht so teuer wie man zunächst denkt (was man z.B. daran sieht, dass ich mir eins für mein Blog leisten konnte ;) ). SSL Zertifikate gibt es ab ca. $15 pro Jahr. Für den Einsatz in kommerziellen Projekten also quasi "Peanuts", für den privaten Einsatz aber sicher nicht ganz unproblematisch. Eine mögliche Alternative für den privaten Einsatz sind kostenlose Zertifikate von startssl.com. Diese Zertifikate funktionieren mit CardSpace jedoch nur bei Anwendern, die das CA Root Zertifikat von startssl auf ihrem Rechner installiert haben.

"CardSpace ist nicht interoperabel zu anderen Identitätstechnologien (OpenID, ...)"
Falsch! CardSpace ist sogar so extra konzipiert, dass es wunderbar mit anderen Technologien zusammenarbeiten kann. Die CardSpace-Spezifikation schreibt z.B. nicht vor, welches Sicherheitstokenformat für die Authentifizierung mit CardSpace verwendet werden soll. Selbstausgestellte Karten arbeiten mit SAML Tokens, die auch in anderen ID-Technologien wie z.B. Shibboleth oder Liberty Alliance und natürlich SAML selbst verwendet werden. Bei verwalteten Karten kann ein beliebiges Securitytokenformat verwendet werden. Solange der Identitätsanbieter und die Relying Party (= z.B. die Webseite, gegenüber der man sich authentifiziert) beide eine gemeinsame "Sprache" sprechen und das Token verstehen ist das Format vollkommen egal.

Auch mit OpenID kann man CardSpace wunderbar verwenden. Im xmldap CardSpace Identity Selector kann man z.B. eine OpenID als "verwalte Karte" nutzen. Eine weitere sinnvolle Anwendungsmöglichkeit ist der Einsatz von CardSpace als Authentifizierungsmöglichkeit gegenüber einem OpenID-Identitätsanbieter. OpenID selbst ist anfällig gegenüber Phishing. Diese Schwäche lässt sich vermeiden, wenn man beide Technologien kombiniert. Ich bin gerade dabei, diese Idee von Kim umzusetzen und einen OpenID-Server zu schreiben, der CardSpace als Authentifizierung nutzen kann - mehr dazu später in einem eigenen Eintrag.

"Durch CardSpace kann ein Profil über die Seiten die ich besuche erstellt werden"
Falsch! Bei CardSpace authentifiziert man sich nicht mit nur einer Identität, sondern man besitzt beliebig viele Karten und somit auch Identitäten. Selbst wenn die gleiche Karte auf mehreren Seiten eingesetzt wird, enthält die Karte für jede Seite eine eigene PPID (private personal identifier). Wenn ich z.B. eine Karte auf Seite A und Seite B verwende, so hat Seite A keine Möglichkeit, die Daten aus der Karte zu verwenden, um sich unter meinem Namen auf Seite B anzumelden.

Ein Identitätsanbieter sieht (in der Standardeinstellung) auch nicht, auf welchen Seiten ich mich mit der Identität dieses Anbieters authentifiziere. Er kann also kein Profil über mich erstellen. Für Anwendungsfälle, in denen diese Information dennoch notwendig ist, ist das möglich, dann wird der Benutzer bei der Verwendung der Karte darauf hingewiesen, dass der Identitätsanbieter diese Information erhält.

"Wenn mein Computer gestohlen/gehackt wird hat der Dieb/Hacker zugriff auf alle meine Identitäten"
Falsch! Um auf die Karten eines Benutzeraccounts zugreifen zu können müsste jemand, der den Computer gestohlen hat, zumindest das Benutzerkennwort kennen. Karten können außerdem zusätzlich mit einer eigenen PIN pro Karte versehen werden, in dem Fall kommt also auch ein angemeldeter Nutzer ohne die PIN nicht an die Karten. Die Karten werden besonders geschützt auf dem Rechner gespeichert und sind doppelt verschlüsselt (mit einem Schlüssel des jeweiligen Benutzers und mit dem des Systems). Selbst ein Administrator hat so ohne das Kennwort des Nutzers keinen Zugriff auf die Karten. Selbst  wenn er das Nutzerkonto ändert hat er keinen Zugriff, der Schlüssel wäre in dem Fall zerstört (wie z.B. auch bei Verschlüsselung im Dateisystem). Verwaltete Karten können zusätzlich geschützt werden, z.B. über SmartCards oder ein zusätzliches Passwort. Die Daten von verwalteten Karten sind ja außerdem sowieso beim Identitätsanbieter gespeichert, der sie ausgestellt hat.

Das CardSpace User Interface wird in einem eigenen, abgeschotteten Desktop angezeigt. Andere Prozesse haben auf diesen Desktop keinen Zugriff. Ein Trojaner hätte also keine Möglichkeit, CardSpace fernzusteuern und den Benutzer irgendwo anzumelden oder seine Daten aus der CardSpace Benutzeroberfläche zu stehlen.

 

Ich hoffe ich konnte mit diesem Artikel einige Vorurteile beseitigen. Wer neugierig geworden ist und jetzt mehr über CardSapce erfahren möchte sollte auf der CardSpace Seite und in Kims IdentityBlog beginnen.

Kick it on dotnet-kicks.de

CardSpace login for dasBlog - download

Tuesday, March 27, 2007 3:24:40 PM (W. Europe Daylight Time, UTC+02:00)

(this post is in English, because I think it might be useful for non-German readers as well)

A few days ago I wrote that I added CardSpace support to my blog. I've now cleaned up and commented my source code and you  can download it now.

CardSpace support for dasBlog - download

Use this file at your own risk. I do not guarantee that it is bug free or that it is the best and easiest way to add CardSpace to your blog. All I can say is that it works for me :).

You need .NET 3.0 on your server. You also need a valid SSL certificate (or otherwise you must create your own certificate with tools like selfssl form theIIS 6.0 resource kit and install it on every client from which you want to use the CardSpace login). For my blog, I use a SSL certificate that I bought from http://www.namecheap.com/, which costs less than 15$ / year.

To install CardSpace support for dasBlog, just copy CardSpaceLogin.aspx, CardSpaceLogin.aspx.cs, images\informationcard.gif and app_code\TokenProcessor.cs to your dasBlog directory. 

I'm not the author of TokenProcessor.cs, this file is part of the CardSpace samples on http://cardspace.netfx3.com.

In CardSpace v1, this only works via HTTPS. You need a valid SSL certificate for your web site. The user account under which you run dasBlog
must have access to the private key of your SSL certficate. The CardSpace samples on http://cardspace.netfx3.com contain a tool which can find the name and location of the file in which your SSL certificate is stored (findprivatekey.exe). Find that file and grant your dasBlog ASP .NET account read permissions.

To associate an existing user account with an information card, login by using username and password first. Then go to the CardSpace login page and select a card. This card will then be associated with your user account.

If you use this for your blog, please let me know by e-mail or by writing a comment for this blog entry.

Technorati tags: ,
Kick it on dotnet-kicks.de

Windows CardSpace Vortrag bei der .NET User Group Bonn

Wednesday, March 21, 2007 11:18:50 PM (W. Europe Standard Time, UTC+01:00)

Gestern war ich bei der Bonner .NET User Group und habe dort CardSpace vorgestellt.

Die Fahrt sollte laut Routenplaner knapp über 2 Stunden dauern, sicherheitshalber habe ich (zum Glück) 3 Stunden eingeplant. Für die ersten 160km habe ich 2 Stunden gebraucht, für die letzten 40 dann noch mal eine Stunde.

Was den Veranstaltungsort betrifft sind die Bonner sehr gut ausgestattet - 2 Räume mit entfernbarer Trennwand, beide mit eigenem Rückprojektionsbeamer. Platz war also reichlich, allerdings gab es "nur" 16 Teilnehmer.

Gut gefallen hat mir beim Vortrag, dass viele Fragen gestellt wurden. So war es dann nicht nur Vortrag, sondern teilweise auch eine sehr interessante Diskussion.

Im April kommen Roland Weigelt und Jens Schaller von der Bonner User Group dann zu einem Gegenbesuch nach Paderborn mit einem Vortrag zum Thema "Visual Studio anpassen und erweitern".

Folien und Demos (4,3 MB)

Kick it on dotnet-kicks.de

Windows CardSpace Login in dasBlog integrieren

Wednesday, March 14, 2007 12:00:58 AM (W. Europe Standard Time, UTC+01:00)

In diesem Beitrag werde ich zeigen, wie sich Windows CardSpace in dasBlog integrieren lässt, ohne dass dafür Änderungen am Quellcode von dasBlog notwendig sind. Ziel ist, dass sich der Blog-Administrator mit Windows CardSpace anmelden kann. CardSpace soll in diesem Beispiel nicht für Besucher des Blogs genutzt werden (z.B. für die Kommentarfunktion), sondern nur für den Administrator.

Dafür sind einige Voraussetzungen erforderlich:

1) WebSpace mit .NET 3.0 Unterstützung

Zum Entschlüsseln des CardSpace-Tokens verwende ich die TokenProcessor Hilfsklasse von netfx3.com, die im Moment noch .NET 3.0 Klassen verwendet. Es soll aber bald eine .NET 1.1 Version dieser Klasse geben, so dass mein Code mit dieser Klasse (und noch 2-3 weiteren kleinen Änderungen - ich verwende generische Typen) ebenfalls auf .NET 1.1 laufen würde.

2) Ein SSL Zertifikat

CardSpace funktioniert nur mit einem gültigen und fehlerfreien SSL Zertifikat. Selbstausgestellte Zertifikate gehen auch, wenn sie im Client als vertrauenswürdige Zertifikate gespeichert werden, was in diesem Beispiel (Login nur für den Admin) noch ok wäre. Sollen sich beliebige Besucher der Seite über CardSpace anmelden, ist das keine akzeptable Alternative mehr.

Zum Glück gibt es aber mindestens einen sehr günstigen Anbieter, der Zertifikate für unter 15€ pro Jahr verkauft: http://www.namecheap.com/learn/other-services/cheap-ssl-certificate-rapidssl.asp

Dort habe ich auch ein Zertifikat für OutOfCoffeeException.de für 2 Jahre gekauft.

3) Der Prozess, unter dem dasBlog läuft, muss Zugriff auf den private Key des SSL Zertifikats haben, damit er die Security-Tokens entschlüsseln kann. Einige der Samples auf netfx3 (z.B. dieses) enthalten das Tool findprivatekey.exe, das die Datei, indem ein Zertifikat gespeicher ist, anzeigen kann. Auf diese Datei müssen Leserechte für den Prozess, unter dem dasBlog läuft, gesetzt werden.

Somit wären also die Vorbedingungen geklärt.

Mir war es wichtig, dass mein CardSpace-Login ohne Änderungen am dasBlog Quellcode selbst funktioniert, damit ich später problemlos neuere Versionen installieren kann, ohne meine Änderungen zu überschreiben. Ich habe deshalb eine neue Seite CardSpaceLogin.aspx erstellt, die die CardSpace Anmeldung übernimmt. Außerdem habe ich ein Makro geschrieben, dass einen Link "Anmeldung mit Windows CardSpace" erzeugt, der auf diese Seite verlinkt und das für CardSpace benötigte Object-Tag in die Hauptseite meines Blogs einbaut (wenn man in den Seitenquelltext schaut findet man es ganz am Ende der Seite). Sofern ich mein Blog über https aufgerufen habe kann ich mich so direkt vom Blog aus anmelden.

Die CardSpaceLogin.aspx Seite selbst besteht nur aus einem Button zum Anmelden mit CardSpace und einem Object-Tag:

(ja, der Code ist zu breit für mein Blog, im Moment habe ich aber keine Idee wie ich das schöner formattieren könnte)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CardSpaceLogin.aspx.cs" Inherits="_Default"
    ValidateRequest="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Windows CardSpace Login</title>
</head>
<body>
    <form id="CardSpaceForm" runat="server">
        <div style="text-align: center; padding: 128px;">
            <div style="text-align: center; padding: 32px; background-color: #a0ffa0;">
                <img src="/images/informationcard.gif" alt="Windows CardSpace" /><br /><br />
                <asp:Button runat="server" Text="Anmeldung mit Windows CardSpace" /><br />
                <asp:Literal ID="LoginStatus" runat="server"></asp:Literal>
                <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/privatepersonalidentifier" />
                </object>
            </div>
        </div>
    </form>
</body>
</html>

 Dieser Object-Tag wird von Browsern, die CardSpace unterstützten, erkannt. In dem Moment wo der Button geklickt wird, wird das Formular "submitted", also die Formularinhalte an den Server übertragen. Da der Object-Tag im Formular steht, erkennt der Browser, dass er an dieser Stelle ein CardSpace-Securitytoken übermitteln soll. Also wird dem Benutzer ein Dialog (der Identityselector) angezeigt, in dem er eine Karte für die Anemdlung an der Seite auswählen kann. Das (verschlüsselte und signierte) SecurityToken wird anschließend an den Server übertragen und kann dort ausgewertet werden.

Etwas vereinfacht wird nun der folgende Code ausgeführt:

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        SiteConfig siteConfig = SiteConfig.GetSiteConfig();

        string stoken = Request["xmltoken"] as string;
        if (string.IsNullOrEmpty(stoken))
        {
            return;
        }

        Microsoft.IdentityModel.TokenProcessor.Token token = 
            new Microsoft.IdentityModel.TokenProcessor.Token(stoken);       

        List<CardSpaceToken> tokens = CardSpaceToken.GetTokens();

        // compare the token with all tokens in cardspaceSecurity.config
        foreach (CardSpaceToken cst in tokens)
        {
            // found token in cardSpacesecurity.config, now find
            // the user with the user name that was specified there
            if (token.UniqueID == cst.UniqueID)
            {
                SiteSecurityConfig securityConfig = SiteSecurity.GetSecurity();
                foreach (User user in securityConfig.Users)
                {
                    // found user with this CardSpace token. log the user in.
                    if (user.Name == cst.UserName)
                    {
                        Login(user.Name, user.Password);
                        Response.Redirect(Utils.GetBaseUrl(), true);
                        return;
                    }
                }
            }
        }        
    }

}

Mit der anfangs erwähnten Hilfsklasse TokenProcessor wird das Token entschlüsselt. Über die Klasse könnte ich sämtliche Inhalte des Tokens abfragen, mich interessiert hier aber nur die UniqueID. Diese ID ist für jeden Benutzer eindeutig, und ersetzt quasi Benutzername + Kennwort. Ich muss diese ID nur noch mit den IDs vergleichen, die ich bereits für meine Blog-Benutzer gespeichert habe. Finde ich eine passende gespeicherte ID, dann melde ich den Benutzer an. Falls ich keine ID finde, aber bereits ein Benutzer angemeldet ist, dann ordne ich die ID der verwendeten Karte diesem Benutzer zu (dieser Teil ist im Codeausschnitt oben schon nicht mehr zu sehen).

Das war's auch schon. Um CardSpace in meinem Blog zu verwenden musste ich keine einzige vorhandene Datei ändern, und nur 3 neue Dateien hinzufügen (CardSpaceLogin.aspx, CardSpaceLogin.aspx.cs und TokenProcessor.cs). Zusätzlich habe ich dann noch ein Makro geschrieben, um den Anmeldelink in mein Blog zu integrieren, aber das ist im prinzip schon zusätzliche Sonderausstattung :).

Ich werde in den nächsten Tagen den Code noch etwas aufräumen und anschließend veröffentlichen.

Ich bin nicht der erste, der CardSpace in dasBlog integriert. Eine andere Variante gibt es hier: Early SVN patch of DasBlog 1.9.6264 with information card support available. Für meine Variante ist jedoch keine Modifikation am original Quellcode erforderlich.

Kick it on dotnet-kicks.de
Previous Page Page 2 of 3 in the WindowsCardSpace category Next Page