Archive for the 'CSharp' Category

Hash eines Passworts erstellen

Kaum eine Anwendung kommt heute noch ohne Passwort aus. Aufgrund dieser Tatsache verwenden Benutzer häufig einfache Passwörter, oder schlimmer noch - für jede Anwendung das gleiche Passwort. Umso wichtiger ist es das die Entwickler der Anwendung die Passwörter der Benutzer schützen, und das so gut wie möglich.

Damit Angreifer bei einer Komprimitierung der Datenbank nicht alle verwendeten Passwörter im Klartext vor sich haben, empfiehlt es sich ein Hash des Passworts zu erstellen und diesen in Verbindung mit einem Zufallswert (genannt Salt) in der Datenbank zu speichern.

Seit der Version 2.0 des .NET Frameworks steht die Klasse Rfc2898DerivedBytes zur Verfügung, welche auf dem Passwort-Hashing-Standard RFC2898 basiert.

Zunächst muss der Zufallswert (Salt) erstellt werden. In diesem Beispiel wird eine 16 byte lange Zufallszahl erstellt. Denkbar wäre jedoch auch eine Verwendung des Benutzernames, oder eines anderen eindeutigen Wertes.

byte[] GetSalt(int length)
{
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buff = new byte[length];
    rng.GetBytes(buff);

    return buff;
}

In Verbindung mit dem Salt kann nun der Passwort Hash erstellt werden.

byte[] GetHashPassword(string password, byte[] salt)
{
    Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(password, salt, 10000);
    return rfc.GetBytes(16);
}

Die zurückgegeben Werte müssen, bevor Sie in der Datenbank gespeichert werden können, in einen Base64 String umgewandelt werden.

Bei der Anmeldung eines Users wird das eingegebene Passwort mit dem in der Datenbank gespeicherten Salt in einen Hash umgewandelt und mit dem Hash in der Datenbank verglichen. Bei Erfolg kann die Anmeldung fortgesetzt werden.

Das Beispielprojekt als Konsolenanwendung kann hier runtergeladen werden.

Active Directory Authentifizierung mit C# via LDAP

Die Authentifizierung gegen ein Active Directory via LDAP ist mit wenigen Zeilen zu lösen. Nachdem Hinzufügen der Referenz System.DirecotryServices kann mit Angabe der Domäne, Benutzername und Passwort ein Aufruf mit Hilfe der Klasse DirecoryEntry gestartet werden.

static bool Authenticate(string domain, string username, string password)
{
    bool isAuthenticated = false;

    try
    {
        DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, username, password);
        object nativeObject = entry.NativeObject;
        isAuthenticated = true;
    }
    catch (DirectoryServicesCOMException) { }

    return isAuthenticated;
}

Das Beispielprojekt kann hier runtergeladen werden.

Twitter und C#

Momentan scheint Twitter wieder in aller Munde zu sein - zumindest haben viele Freunde und Bekannte in den letzten Wochen einen Twitter Account erstellt und sind nun fröhlich am twittern.

Grund genug auszuprobieren, wie schwer oder wie einfach es ist einen Tweet per C# zu senden. Hierfür muss natürlich zunächst ein Test-Account erstellt werden. In diesem Fall lautet der Username passenderweise BlaBlubBlog. Twitter stellt externen Programmen eine API zu Verfügung, die unter http://apiwiki.twitter.com/ dokumentiert ist. Die API basiert auf REST und kann somit ohne weitere Hilfsmittel per C# angesprochen werden.

Zunächst ist es erforderlich eine Anmeldung per HTTP Basic Authentication durchzuführen. Hierfür ist die Klasse HttpWebRequest erforderlich, an die der Benutzername und das Passwort übergeben wird.

HttpWebRequest request = WebRequest.Create(twitterUpdateUrl) as HttpWebRequest;
request.Proxy = HttpWebRequest.DefaultWebProxy;
request.Credentials = new NetworkCredential("BlaBlubBlog", "<PASSWORD>");

Die Url um einen Tweet abzuschicken bzw. den Status zu setzen lautet http://twitter.com/statuses/update.xml. Nachdem der gewünschte Text per UrlEncode() Methode für das Senden vorbereitet wurde, wird der ContentType und die Art der Datenübertragung - in diesem Fall POST - gesetzt. Weiterhin werden die nötigen Parameter erstellt, zum einen der Text selbst und zum anderen die Quelle oder Anwendung, von der aus der Tweet gesendet wurde.

twitterText = HttpUtility.UrlEncode(twitterText);

request.Method = "POST";

request.ContentType = "application/x-www-form-urlencoded";
string param = "status=" + twitterText;
string sourceParam = "&source=BlaBlubBlog";
request.ContentLength = param.Length + sourceParam.Length;

Nachdem alle Vorbereitungen abgeschlossen sind, können die Daten nun per StreamWriter geschrieben werden. Mt Hilfe der HttpWebResponse Klasse werden die Daten an Twitter gesendet und die Rückantwort ausgewertet. Diese kann als Xml-Dokument geladen und verarbeitet werden. Im Node Status befindet sich die Meldung bezüglich des abgesetzten Tweet.

StreamWriter stOut = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(param);
stOut.Write(sourceParam);
stOut.Close();

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    StreamReader reader = new StreamReader(response.GetResponseStream());

    XmlDocument doc = new XmlDocument();
    doc.Load(reader);

    XmlNode node = doc.SelectSingleNode("status");
}

War die Übertragung erfolgreich, erscheint das Tweet umgehend auf der Hauptseite des Benutzers.

Tweet

Dieses Beispiel hat gezeigt wie einfach es ist per C# mit Twitter zu kommunizieren. Natürlich sind noch viele Dinge mehr möglich, die aber den Rahmen dieses einfachen Beispiels sprengen würden.

Das Beispielprojekt gibt es zum Download unter der Url
http://www.veloursnebel.de/Code/TwitterClient.zip

7. Ausgabe des .NET BlogBook veröffentlicht

Bereits am 15.10. wurde die siebte Version des BlogBooks veröffentlicht.
In dieser Ausgabe stecken einige Neuerungen:

  • Es gibt kein einzelnes PDF mehr. Die einzelnen Teilbereiche wurden in verschiedene Dateien verpackt. So kann man zwischen den Bereichen wählen - Mit der Ergebnis das Downloadgröße und Zeit minimiert werden. 
  • Alles wurde in ein neues Layout verpackt. Damit wird sichergestellt, dass die Lesbarkeit nun besser gegeben ist und auch die Ergebnisse beim Druck positiver ausfallen.
  • Neue Beiträge wurden hinzugefügt.

Im ersten Schritt steht nur der Bereich Windows Presentation zur Verfügung. Alle weiteren Bereiche werden in den nächsten Tagen nachgeliefert.

Rückmeldungen und konstruktive Kritik sind mir und Norbert natürlich immer herzlich willkommen. Weitere Informationen und Download-Möglichkeiten finden sich auf der Projekt-Homepage unter http://www.dotnet-blogbook.com

Gewinner des Xtopia Gewinnspiels

xtopia

Nach fünf Wochen Gewinnspiel und weit mehr als 400 Teilnehmern wurde es nun endlich Zeit die Gewinner zu ziehen. Zu gewinnen gab es zwei Tickets zur Xtopia und ein Microsoft Expression Studio 2. Ich möchte mich für die rege Teilnahme bedanken und das positive Feedback welches ich per Email erhalten habe.

Die Gewinner selbst wurden soeben per E-Mail benachrichtigt - Herzlichen Glückwunsch an dieser Stelle.

Der ?? Operator

Einer der unbekanntesten Operatoren, die C# zu bieten hat, ist der ?? Operator. Noch unbekannter ist der Name des Operators: Null-Koaleszenz-Operator. Der Operator ist zu unrecht unbekannt, erfüllt er doch einen durch aus sinnvollen Zweck und erspart so manche Schreiberei. Ist der linke Bereich des Operators ungleich null, wird dieser zurückgegeben, ansonsten wird die rechte Seite verwendet. Ein durchaus gängiges Beispiel ist die Initialisierung von Variablen:

MyClass cls = Helper.GetValue() ?? new MyClass();

Gibt GetValue() keinen Wert zurück (also null), wird automatisch eine neue Instanz der Klasse erstellt, so dass bei Zugriff auf die Variable in jedem Fall keine Exception geworfen wird.

Mehr Informationen gibt es natürlich noch an anderer Stelle:

http://blog.norberteder.com/index.php?entry=entry061113-082129
http://msdn.microsoft.com/de-de/library/ms173224.aspx

Gewinnspiel zur Xtopia 2008

xtopia
Im letzten Jahr fand zum ersten Mal die Xtopia Konferenz speziell für Technologien rund um das Web statt. Dieses Jahr geht die Xtopia in die zweite Runde mit noch stärkerem Fokus auf die Webthemen und hoher Relevanz für Business, Webentwicklung und -design. Die Besucher können zwei Tage lang aus vier parallelen Vortragsreihen - aufgeteilt in Business, Web-Technologien, Design und UX - wählen und erhalten somit brandneue Informationen und Wissen.
Vom 01.08.2008 bis zu 05.09.2008 gibt es deshalb die Möglichkeit zwei Tickets zur Xtopia und ein Microsoft Expression Studio zu gewinnen. Hierzu müssen nur die folgenden Fragen richtig beantwortet werden. Mehr Informationen zu den Fragen gibt es unter dem jeweiligen Hinweis-Link. Unter allen richtigen Einsendungen entscheidet das Los.

Bitte die Lösungen per Email an gewinnspiel@veloursnebel.de senden

1) Frage:

Wie heißt die neue Produkt-Familie professioneller Werkzeuge für Webdesigner, Interactive Designer und Entwickler von Rich Internet Applications?

 

a) Microsoft Expression Studio 2
b) MSDN
c) Visual Studio
d) .NET Framework
Hinweis: http://go.microsoft.com/?linkid=9286784


2) Frage:

Xtopia ist die Microsoft-Konferenz für Business, Web Technology, Design & ????

a) UX
b) Andere
c) Architects
d) Database-Engineers

Hinweis: http://go.microsoft.com/?linkid=9286785

3) Frage:

Bis wann läuft die Early-Bird-Promotion der Xtopia?

 

a) 19.09.2008
b) 10.09.2008
c) 19.10.2008
d) 24.12.2008
Hinweis: http://go.microsoft.com/?linkid=9286786

4) Frage:

 

Wie heißen die vier Tracks der Xtopia?
a) Business/Design/UX/Technology
b) Business/Design/UX/Developer
c) Business/Creative/UX/Technology
d) Marketing/Design/UX/Technology

Mehr Informationen zu Xtopia 2008 gibt es unter http://www.xtopia.de. Wichtig: Noch bis zum 19.09 kann unter Verwendung des günstigen Early-Bird-Tarif gebucht werden.

Generische Liste aus anonymen Typen erstellen

Die anonyme Typen gehören zu den neuen C#3.0 Erweiterungen. Nun wurde ich gefragt, ob es möglich ist aus anonymen Typen eine generische Liste zu erstellen. Zwar habe ich die Frage im ersten Moment mit “Natürlich!” beantwortet, merkte dann aber doch recht schnell das ich nicht genau wusste wie die Anforderung umzusetzen ist.

var customer = new { Firstname = "Kai", LastName = "Gloth" };

List list = new List

Schlussendlich bin ich mit Hilfe von IntelliSense und ein wenig ausprobieren auf die Lösung gekommen.

var customer = new { Firstname = "Kai", LastName = "Gloth" };

var customerList = (new[] { customer }).ToList();

customerList.Add(new { Firstname = "Olli", LastName = "Seitenschneider"});

Obwohl das Problem mit obigem Code gelöst ist, ist die Umsetzung doch ein wenig gewöhnungsbedürftig.

.NET BlogBook Ausgabe 6

dotnet_blogbook_header

Seit gestern steht die neue Ausgabe - genauer gesagt die 6. Ausgabe - des .NET BlogBook zum Download bereit. Auch diese Ausgabe wurde wieder durch zahlreiche Artikel und Infos angereichert. Insbesondere im Bereich der Windows Presentation Foundation wurde zugelegt.

Weiterhin gibt es ein neues Cover, welches in Verbindung mit 69° media solutions entstanden ist.
Mehr Informationen um das BlogBook und natürlich den Download selbst gibt es unter http://www.dotnet-blogbook.com

Für Anregungen, Fragen oder Kritik sind Norbert und ich natürlich immer offen.

C# 3.0 - Erweiterungsmethoden

Eine Neuerung von C# 3.0 sind Erweiterungsmethoden. Erweiterungsmethoden bieten die Möglichkeit bereits vorhandene Klassen mit weiterer Funktionalität auszustatten. Dabei können auch Klassen oder Strukturen erweitert werden, die als sealed gekennzeichnet sind oder Bestandteil des .NET Frameworks sind.

In folgendem Beispiel wird System.Int32 um eine Methode erweitert, die den aktuellen Wert mit einem Faktor multipliziert. Dazu wurde eine neue statische Klasse Extension hinzugefügt. Innerhalb dieser Klasse gibt es eine Methode mit dem Namen Multiplizieren. Diese Methode hat zwei Parameter, wobei eigentlich nur der erste interessant ist. Auffällig ist das Schlüsselwort this. Mit Hilfe dieses Schlüsselwortes erweitert der Compiler den Datentyp int um die angegebene Methode.

static class Extension
{
    public static int Multiplizieren(this int instance, int factor)
    {
        return instance * factor;
    }
}

Auch im Visual Studio IntelliSense ist diese Methode bereits vorhanden und wird dort mit einem speziellen Symbol und der Kennzeichnung (extension) angezeigt.

extension

Natürlich können Erweiterungsmethoden auch in Verbindung mit generischen Typen verwendet werden. In folgendem Beispiel wird die generische Liste um Methode HasElements erweitert. Diese Methode soll ausgeben, ob Elemente in der Liste enthalten sind.

static class Extension
{
    public static bool HasElements(this List list)
    {
        return list.Count > 0;
    }
}

Auch hier wird die neue Methode ebenfalls sofort im IntelliSense angezeigt.

GenericExtension