ASP.NET 4.5 auf IIS 7.5 mit SQL Server Express 2012 einrichten

Hier mein Vorgehen nach langem und frustrierendem Herumprobieren:

IIS vorbereiten

  1. Verzeichnis für App anlegen und App hineinkopieren
  2. App im IIS-Manager zum Beispiel als neue Site hinzufügen (mit eigenem AppPool)
  3. Anonyme Authentifizierung auf „AppPool-Identity“ festlegen
  4. AppPool-Grundeinstellungen auf .NET 4.0 (integriert) festlegen
  5. Erweiterte AppPool-Einstellungen auf „Benutzerprofil laden = True“ und „Identität = AppPool-Identity“ festlegen
  6. In der Kommandozeile folgende Befehle ausführen:
    icacls <app-path> /grant "IIS APPPOOL\<apppool-name>":(OI)(CI)(RX)
    icacls <app-path>\App_Data /grant "IIS APPPOOL\<apppool-name>":(OI)(CI)(F)

SQL Server vorbereiten

  1. Mit den folgenden Befehlen den SQL Server Express aktualisieren:
    CREATE LOGIN [IIS APPPOOL\<apppool-name>] FROM WINDOWS
    GRANT CREATE DATABASE TO [IIS APPPOOL\<apppool-name>]

Der passende Connection String

Beim Connection String kann es dann wieder etwas hakelig werden, aber der folgende Eintrag funktioniert ganz gut:
Data Source=.\SQLEXPRESS; Initial Catalog=<db-name>; Integrated Security=SSPI; AttachDBFilename=|DataDirectory|<db-name>.mdf; User Instance=true

IIS 7 + SQL Server Express 2008

Leider, leider scheint das bei dieser Kombo nicht so „einfach“ zu sein, denn mit „User Instance=true“ kommt es zu Impersonation-Fehlern und ohne fehlen die Rechte im App_Data-Verzeichnis…

Letzteres lässt sich aber korrigieren, indem man dem User „<host-name>\SQLServerMSSQLUser$<host-name>$SQLEXPRESS“ Vollzugriff auf App_Data gewährt – dann kann „User Instance“ komplett weggelassen werden.

WWW-Authenticate (Basic) in ASP.NET

Mit nur wenigen Zeilen lässt sich die Basic Authentication (http://de.wikipedia.org/wiki/HTTP-Authentifizierung) in C# umsetzen:

const String KEY = "BasicAuthKey";
const String Basic = "Basic ";

if (Session.Contents[KEY] == null)
{
    Response.BufferOutput = true;

    String auth = Request.Headers["Authorization"] ?? String.Empty;
    auth = System.Text.Encoding.UTF8.GetString(
        Convert.FromBase64String(auth.StartsWith(Basic)
        ? auth.Substring(Basic.Length) : String.Empty));
    if (auth == "username:password")
    {
        Session.Contents.Add(KEY, new Object());
    }
    else
    {
        Response.Clear();
        Response.Headers.Set(
            "WWW-Authenticate",
            "Basic realm=\"RegisteredUsers@domain.tld\"");
        Response.SetStatus(HttpStatusCode.Unauthorized);
        Response.End();
    }
}

SQL Server Express (localdb) per OleDB ansprechen

Der Zugriff auf die SQL Server Express 2012 Instanz „(localdb)\v11.0“ ist leider nicht über den OleDB-Provider „SQLOLEDB“ möglich. Stattdessen muss „SQLNCLI11“ (der Native Client) verwendet werden. Mit „Trusted_Connection=yes“ kann dann noch die Windows-Authentifizierung aktiviert werden. Der vollständige ConnectionString könnte dann so aussehen:

Provider=SQLNCLI11;
Data Source=(localdb)\v11.0;
Initial Catalog=<DB_NAME>;
Integrated Security=SSPI;
Trusted_Connection=yes;

SQL Server-Datenbank lässt sich nicht wiederherstellen

Das Wiederherstellen (RESTORE) einer auf einem SQL-Server (Standard 2008) gesicherten Datenbank auf einem anderen SQL-Server (Express 2012 – localdb\v11.0) führte heute bei mir zu Fehlermeldungen und Serverabstürzen. Ob neue Datenbank automatisch anlegen lassen oder in vorhandene importieren, machte keinen Unterschied – die MDF- und LDF-Dateien waren vorhanden und auch mit Daten gefüllt, aber die Datenbank ließ sich nicht laden. Leider wusste kein Forum von einer echten Lösung zu berichten, stattdessen wurde mit esoterischen Skripten aufgewartet, die rein gar nichts brachten. Ziemlich frustriert entschied ich mich dann dazu, den letzten Import per „Detach“ im Management Studio aus dem Server zu lösen und dann wieder per „Attach“ neu hinzuzufügen et voíla: die Datenbank war online!

StartSSL – kostenlose SSL-Zertifikate

SSL-Zertifikate müssen nichts kosten! StartSSL bietet einfache SSL-Zertifikate kostenlos an und das Verfahren ist einfach und schnell. Zum Nachweis, dass man eine Domain besitzt, erhält man einen Code wahlweise an hostmaster, postmaster oder webmaster@eigenedomain.tld zugesandt und erst nach Eingabe des Codes auf der StartSSL-Homepage geht es weiter.

Flexible HTML5 Frontends mit Foundation 3

Responsives Design, ein anpassungsfähiges Layout, dessen Aufbau sich nach den Gegebenheiten des jeweiligen Endgerätes richtet und so Anordnung und Darstellung der Elemente entsprechend verändert, ist bei der Vielzahl der möglichen Geräte (PC, Notebook, Tablet, Smartphone, etc.), die eine Webseite heute nutzen, ein immer interessanter werdendes Thema. Statt gezielt einzelne Geräte zu adressieren und so ggf. mehrere Versionen einer Seite vorzuhalten, ermöglichen entsprechende Frameworks eine Version, die auf Basis der Möglichkeiten von HTML5 und CSS3 (und Javascript) an die Erfordernisse der jeweiligen Situation angepasst wird. Foundation 3 ist ein solches Framework und soll im Folgenden anhand eines kleinen Beispiels kurz vorgestellt werden. Eine umfangreiche Einführung findet sich in der Dokumentation auf der Homepage des Herstellers.

Layout-Grundlagen

Die Grundlage des Foundation 3-Layouts ist das „Grid“, ein Gitter aus Zeilen und Spalten, das auch Verschachtelungen unterstützt. Zeilen enthalten dabei Spalten, von denen immer 12 ein Ganzes bilden. Die Breite einer Spalte ist relativ zum verfügbaren Platz und letztendlich in Prozent definiert. Über CSS-Klassen wird angegeben, wie viele Spalten ein bestimmter Inhalt breit sein soll (1 bis 12 Spalten, 1/12 bis 12/12 der verfügbaren Breite, also 8,3333% bis 100%).

Ein einfaches, dreispaltiges Layout

Ein einfaches, dreispaltiges Layout ist schnell realisiert:

<div class="row">
    <div class="two columns">
        <h3>Linke Spalte</h3>
        <p>z.B. Navigation</p>
    </div>
    <div class="eight columns">
        <h1>Mittlere Spalte</h1>
        <p>für Inhalt</p>
    </div>
    <div class="two columns">
        <h3>Rechte Spalte</h3>
        <p>z.B. für weiterführende Informationen</p>
    </div>
</div>

Das Ergebnis

Hier mit markierter Zeile:

und hier mit markierten Spalten:

und bei reduzierter Breite offenbart sich das responsive Layout:

Erweitertes Layout

Unter http://demo.jochenlinnemann.de/foundation/ habe ich ein erweitertes Layout hochgeladen. Hier kommen die Top-Bar und die Breadcrumbs von Foundation 3 zum Einsatz. Wie im obigen Beispiel zu sehen ist, ist eine Zeile auf 940px Breite vorkonfiguriert. Im erweiterten Layout habe ich durch eine eigene Klasse die Spaltenbreite auf 100% des Dokumentes festgelegt. Standardmäßig wechselt das Layout unterhalb einer Breite von 768px in den „Mobilgerätemodus“. Dies habe ich auch im erweiterten Layout beibehalten. Lediglich für die Top-Bar habe ich den Umbruch des Layouts auf 340px heruntergesetzt, da bis dahin genug Platz für alle Buttons bleibt.

Zwei Zeilen, zwei Spalten und Schachtelungen

<header class="row full-width">
    <div class="twelve columns">
    </div>
</header>

<div class="row full-width">
    <div class="eight columns">
        <div class="row">
            <div class="four columns">
            </div>
            <div class="four columns">
            </div>
            <div class="four columns">
            </div>
        </div>
    </div>
    <div class="four columns">
    </div>
</div>

Das Ergebnis

Bei höherer Breite:

Und bei reduzierter Breite:

Ausblick

Zukünftige Entwicklungen halten noch ganz andere Möglichkeiten bereit. Ein Ausblick wird in diesem Artikel gegeben: http://www.webkrauts.de/artikel/2012/css3-flexbox-abloesung-fuer-float-layouts