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

dasBlog-Makro zum anzeigen von Kommentaren und Kommentar-Autoren

Saturday, March 10, 2007 10:02:54 PM (W. Europe Standard Time, UTC+01:00)

Da die vorhandenen DasBlog-Makros zum anzeigen von Kommentaren nicht ganz die Ausgabe erzeugen, die ich gerne haben wollte (und weil ich wegen einer neuen Kaffeemaschine und damit verbundenem zu hohen Kaffeekonsum nicht schlafen konnte), habe ich mir gestern Nacht zwei neue Makros geschrieben. Das eine zeigt die letzten 5 Kommentare, das andere eine Liste der Leute, die am häufigsten Kommentare in meinem Blog schreiben.

DasBlog lässt sich mit Makros sehr einfach um neue Funktionen erweitern. Wie das genau geht ist sehr schön auf der dasBlog Webseite beschrieben. Als Grundlage für meine Makros habe ich das Makro von Voidclass verwendet und erweitert.

Was man beachten sollte bei der Makroentwicklung: entwickelt man mit .NET 2.0, dann muss auch dasBlog auf 2.0 laufen, sonst funktioniert es natürlich nicht. Irgendwie hatte ich heute Nacht ein Brett vorm Kopf, ich habe ziemlich lange gebraucht um darauf zu kommen, obwohl ich das ja eigentlich wusste.

Den Quellcode zu meinen Makros gibt's auch zum Download: http://www.outofcoffeeexception.de/downloads/dasBlogCoffeeMacros.zip

Achtung: ich habe den Code irgendwann so um 4 oder 5 Uhr nachts geschrieben. Ich garantiere also für nichts. Der Code ist auch nicht besonders aufgeräumt oder gut kommentiert.

Und wer das Makro mal testen möchte, kann es ja direkt mit einem Kommentar zu diesem Eintrag ausprobieren :)

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

Umzug beendet - dasBlog, neues Design & Visual Studio "Orcas"

Friday, March 09, 2007 9:08:33 PM (W. Europe Standard Time, UTC+01:00)

Mein Blog läuft jetzt über meinen vServer bei united hoster. Dadurch kann ich auch endlich dasBlog einsetzen. Da Thinkjot v1 ja nur eine modifzierte Version von dasBlog ist war der Wechsel problemlos möglich. Selbst die alten Urls für meine Blogeinträge sind gleich geblieben. Sehr wichtig, da ich viele Besucher über verschiedene Suchmaschinen bekomme.

Außer der Blogengine habe ich auch noch das Design gewechselt. Das neue Design ist eine modifizierte Version des Themes kubrick. Ich habe ziemlich viel daran geändert, z.B. gibt es eine zusätzliche dritte Spalte auf der rechten Seite.

Was hat das ganze jetzt mit "Orcas" zu tun? Beim Anpassen des Themes hatte ich Probleme, herauszufinden welche CSS-Eigenchaften sich wie auf das Layout meines Blogs auswirken, da die css Definitionen des kubrick Themes nicht gerade übersichtlich und auf mehrere Dateien verteilt sind. Visual Studio 2005 war keine große Hilfe, das konnte das Blog nicht mal im Designer anzeigen, da der Code dafür zu viele Fehler hatte. Die März CTP von "Orcas" beinhaltet jedoch einen komplett neuen Webdesigner. Der kann nicht nur mein Blog in der Design-Ansicht anzeigen, sondern er hat auch noch ein neues CSS-Eigenschaften Fenster, über das sich leicht feststellen lässt, welche CSS Eigenschaften für rein HTML Element gesetzt sind und wo diese her kommen. Damit war es dann kein Problem mehr, das Design meines Blogs anzupassen. Der CSS Code ist zwar jetzt noch unaufgeräumter und unübersichtlicher, ;) aber es funktioniert mindestens im IE7 und Firefox 2.0.

CSS Eigenschaften in Visual Studio Orcas

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

Providerwechsel

Thursday, March 08, 2007 3:36:44 PM (W. Europe Standard Time, UTC+01:00)

Ich werde mit meinem Blog http://www.outofcoffeeexception.de und der Domain http://www.dotnet-paderborn.de zu einem anderen Provider wechseln. Dadurch ist mein Blog und die Seite der .NET User Group Paderborn möglicherweise vorübergehend nicht erreichbar.

Ich war mit Domainbox als Provider sehr zufrieden, allerdings benötige ich mehr Möglichkeiten als ein normales shared Hosting mir bieten kann. Deshalb wechsele ich zu einem vServer von http://de.united-hoster.com.

Vielen Dank für die vielen Antworten auf meine Frage nach einem vServer Provider, darüber bin ich ja nun auch bei united-hoster gelandet :).

Nachdem ich zuerst einen server4you vServer mit nur 256mb und nun einen vServer von united Hoster mit 420mb Arbeitsspeicher ausprobiert habe noch ein dringender Hinweis an alle, die einen vServer mieten wollen: Finger weg von den ganz billigen Angeboten mit wenig Arbeitsspeicher. Bei der 256mb Variante von server4you sind sehr viele Setups (z.B. SQL Express, .NET 3.0) aus Speichermangel abgestürzt. Man hat wirklich nur 256mb, auch eine größere Auslagerungsdatei anlegen ist wohl nicht möglich. Mit 256mb kann man wirklich nicht viel anfangen.

Bei den 420mb die ich bei united Hoster habe ist es wenigstens möglich, SQL Server 2005 Express und .NET 3.0 zu installieren. Für die SharePoint Services 2007 reicht es nicht, der Konfigurationswizard stürzt wegen Speichermangel ab (man kann sehr schön im Task Manager beobachten wie der Balken für die Auslagerungsdatei wächst, sobald er voll ist -> Fehler).

Eventuell werde ich deshalb auch noch auf eine noch größere Variante wechseln. Allerdings brauche ich eigentlich nur mehr Arbeitsspeicher, was im Moment noch nicht einzeln möglich ist (ist aber wohl schon geplant).Ich habe schon jetzt ein vielfaches meines Bedarfs an Festplattenplatz und Traffic.

(Dieser Eintrag hat nicht direkt mit .NET zu tun, aber ich habe ihn trotzdem in die Kategorie .NET eingeordnet, damit er auf blogs.dotnetgerman.com auftaucht)

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

Neue Version von Thinkjot

Sunday, March 04, 2007 10:29:02 PM (W. Europe Standard Time, UTC+01:00)

Es gibt eine neue Version von ThinkJot, der Blogsoftware, die ich für mein Blog benutze. Sieht sehr vielversprechend aus, ist aber noch Beta und es funktionieren noch nicht alle Features.

Während Thinkjot v1 noch sehr an dasBlog erinnert, auf dem es basiert, scheint Thinkjot v2 zum größten Teil eine Neuentwicklung zu sein. Das ist einerseits gut (der Thinkjot Code war für mich auf den ersten Blick verständlicher als der dasBlog Code), hat aber auch den Nachteil, dass ein Wechsel von Thinkjot v2 zu dasBlog vorerst nicht mehr möglich ist. Thinkjot v1 und dasBlog verwenden (anscheinend) noch das gleiche Format zum Speichern der Blogeinträge.

Ich würde ja gerne die aktuelle Version von dasBlog verwenden, aber leider verträgt die sich nicht so richtig mit dotnet-paderborn.de, die auf dem gleichen Webspace läuft. Ich müsste dafür zuerst dotnet-paderborn.de ändern, und dafür habe ich keine Zeit.

Bleibt mir also vorerst nur, weiter auf Thinkjot v1 zu bleiben und entweder irgendwann dotnet-paderborn.de und mein Blog auf jeweils eigenen Webspace zu bringen, damit ich dann dasBlog nutzen kann, oder ich muss auf die fertige Version von Thinkjot v2 warten und dann wechseln. Das große Risiko dabei ist aber, dass Thinkjot nur von einem einzigen Entwickler entwickelt wird.

 

Technorati tags: ,
Kick it on dotnet-kicks.de
Previous Page Page 2 of 4 in the OutOfCoffeeExceptionde category Next Page