ASP.NET MVC 5 – was ist neu?
Nach dem großen Erfolg vom ASP.NET MVC 4 Framework und der WebAPI kommt nun die nächste Version ins Rennen: ASP.NET MVC 5. Diese wird als Teil des neuen Visual Studio 2013 mitgeliefert, kann aber natürlich problemlos auch bei älteren Projekten nachgeliefert werden. Noch nicht ausprobiert? Dann wird es Zeit, denn mit dem neuen MVC5-Framework werden neben einigen Neuerungen auch ein paar Altlasten beseitigt.
Die Sauerei (auch genannt: One ASP.NET)
Ganz richtig gelesen, mit dem Release von Visual Studio 2013 kann ein richtiger Mix an ASP.NET Technologien gemacht werden. Zum Beispiel, wenn ein Projekt mit MVC5 begonnen wurde, ist es kein Problem, eine Web Form Page hinzuzufügen. Ebenfalls kann die WebAPI nun in ein normales WebForms-Projekt verankert werden. Grund des Ganzen ist, laut Microsoft, dass wir Entwickler, es nun einfacher haben, unsere Sachen in ASP.NET zu entwickeln. Fazit: wo sie recht haben, haben sie recht.
ASP.NET Identity
Das ASP.NET Identity ist das neue Membership-System für alle ASP.NET Anwendungen, denn es basiert im Gegensatz zum alten System auf OWIN und nicht auf das ASP.NET Forms Authentication Modul.
Dies ermöglicht eine problemlose Integration sei es in ein MVC-, als auch in ein WebForms-Projekt. ASP.NET Identity ermöglicht es dem Benutzer, sich einen Account direkt auf der Webseite zu erstellen, oder aber über die Sozialen Netzwerke wie Facebook, Google und Twitter anzumelden. Standardmäßig verwendet das System eine SQL-Server LocalDB Datenbank, welche anschließend für produktiv-Systeme auf SQL Server oder auch auf NoSQL Datenbanken wie Windows Azure Storage tables gebracht werden kann.
Claims-based Authentication
Bei der ASP.NET claims-based authentication besteht die Identität des Benutzers einfach ausgedrückt aus einem Set von Claims, welche das System vertrauen muss und ebenfalls von einem vertrauenswürdigem System ausgestellt werden. Benutzer können sich dabei wie folgt anmelden:
- mit ihrem Benutzername und Password, welche in der Datenbank gespeichert sind
- über einen social identity provider wie Facebook, Google oder Twitter
- über Organisations-Accounts durch Windows Azure Active Directory
- oder über Active Directory Federation Service (ADFS)
Um zum Beispiel den Google OpenID prodiver zu aktivieren, genügt es folgende Zeilen in der App_Start/Startup.Auth.cs auszukommentieren:
public void ConfigureAuth(IAppBuilder app) { // Enable the application to use a cookie to store information for the signed in user app.UseApplicationSignInCookie(); // Enable the application to use a cookie to temporarily store information about a user logging in with a third party login provider app.UseExternalSignInCookie(); // Uncomment the following lines to enable logging in with third party login providers //app.UseMicrosoftAccountAuthentication( // clientId: "", // clientSecret: ""); //app.UseTwitterAuthentication( // consumerKey: "", // consumerSecret: ""); //app.UseFacebookAuthentication( // appId: "", // appSecret: ""); app.UseGoogleAuthentication(); }
Mehr Informationen, wie man eine ASP.NET MVC 5 App mit Facebook oder Google authentifiziert gibt es hier.
Bootstrap
Das neue Projekt-Template beinhaltet jetzt Bootstrap, welches dem Projekt ein ordentliches und responsives Aussehen gibt. Dazu ist das Bootstrap-Framework sehr einfach anzupassen und eignet sich optimal für Projekte, welche schnell umgesetzt werden müssen oder wenig Zeit für Design übrig haben.
Authentication Filters
Diese Filter bieten im Grunde genommen die Möglichkeit, sich vor die normalen Authorization-Filters in der ASP.NET MVC Pipeline zu hängen. Damit kann die Authentifizierungslogik pro Action, Controller oder global für alle Controllers eingestellt werden. Sie verarbeiten die Anmeldeinformationen der Anfragen und bieten Zugriff auf das jeweilige Prinzipal.
Wenn ein solches Filter-Attribut erstellt werden soll, muss dieses das IAuthenticationFilter-Interface implementieren, welches zwei Methoden definiert: OnAuthentication und OnAuthenticationChallenge (Letztere verwenden wir, um den Zugang anhand des authentifizierten Benutzers einzuschränken).
Ein Beispiel für einen einfachen Filter, welcher den Benutzer einfach zurück auf die Login-Seite leitet, falls dieser nicht authentifiziert ist, sieht wie folgt aus:
public class BasicAuthAttribute : ActionFilterAttribute, IAuthenticationFilter { public void OnAuthentication(AuthenticationContext filterContext) { } public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) { var user = filterContext.HttpContext.User; if (user == null || !user.Identity.IsAuthenticated) { filterContext.Result = new HttpUnauthorizedResult(); } } }
Filter overrides
Wie der Name schon sagt, ist es mit diesen Filtern möglich, bereits angewendete Filter an einer Action-Methode oder an einem Controller zu überschreiben. Damit sollen bestimmte Filter für einen gewissen Bereich deaktiviert werden. Dies ist besonders nützlich, wenn zum Beispiel ein Filter global gültig ist, dieser aber auf einzelne Methoden nicht angewendet werden soll.
Attribute Routing
Mithilfe von Tim McCall, Author von attributerouting.net, wird Attribute Routing nun in ASP.NET MVC unterstützt. Damit soll es möglich sein, Routen für Action-Methoden und Controllern zu individualisieren:
public class MoviesController : ApiController { [Route("movies")] public IEnumerable<Movie> Get() { } [Route("actors/{actorId}/movies")] public IEnumerable<Movie> GetByActor(int actorId) { } [Route("directors/{directorId}/movies")] public IEnumerable<Movie> GetByDirector(int directorId) { } }
Dazu gibt es noch einen Syntax für optionale Parameter, Standardwerte und Einschränkungen:
// Optionaler Parameter [Route("people/{name?}")] // Standard Wert [Route("people/{name=Rob}")] // Constraint: Nur alphanumerische Werte [Route("people/{name:alpha}")]
Das Attribute Routing kann natürlich auch in der neuen Web API 2 verwendet werden.
Fazit
Kurz und bündig: Ja, wir finden die Neuerungen recht nett, die meisten auch sinnvoll und brauchbar. Die Unterstützung von OWIN ist gut gelungen, insbesondere, dass neue Komponenten (wie ASP.NET Identity) auch als Middleware zur Verfügung stehen.
Dass sich Microsoft immer mehr in die Open-Source Richtung bewegt, wird damit unterstrichen und dies schafft sicherlich Sympathie. Dass Bootstrap von Haus aus implementiert wird, muss in unseren Augen nicht an die große Glocke gehängt werden, trotzdem: Wir sind zufrieden!
Mich würde es interessieren, wer nun auf die neue Version updated und wer noch wartet. Comments? 🙂
About the Author
Roberto Bez ist passionierter Webentwickler und TechLead bei der HolidayCheck AG. Für Roberto bedeutet das Entwickeln nicht nur Arbeit, sondern auch Freude, Motivation und täglich neue, aufregende Herausforderungen. Besonders gerne setzt er sich mit neuen Webtechnologien sowie Datenbanken aller Art auseinander und versucht diese in die tägliche Anwendungsentwicklung miteinzubringen. Neben dem Entwickeln trifft man ihn gerne Abends beim Laufen oder im Sommer bei Mountainbike-Touren durch die schönen Berge Südtirols.
MVC5 habe ich nicht ausprobiert. Habe aber die neue WebApi eingeführt bei einem Projekt das wir vor ein paar Wochen gestartet haben da das AttributeRouting es genial einfach macht Routes zu exponieren.
Hi Juri,
Jup, geht mir genauso. WebAPI ist im Einsatz, MVC5 bleibt noch eine Spielwiese. Liegt aber daran, dass die Features (noch) nicht aktiv gebraucht werden.
schön finde ich das ASP.NET wieder einen erkennbaren Schritt gemacht hat. Mehr oder weniger ein deutliches Lebenszeichen, aber im wesentlichen eine Reaktion auf die Veränderungen im Authentifizierungsumfeld und UI Design.
Sehr schade finde ich (aus Webforms sicht) das es Microsoft nicht schafft sowas wie Bootstrap selber auf die Beine zu stellen. Aus Wartungssicht (auch als Open Source) ist für mich eine Bootstrap based Website Horror Szenario.
Nach wie vor glaube ich nicht, das mit dem „Open Source“ auch nur ein Entwickler von PHP oder sonstwas zu MS gelockt wird. Gänzlich unklar ist mir nach wie vor, welches Problem OWIN eigentlich löst. Ich sehe keinen Kunden den ich sagen könnte „nimm Owin statt IIS und gut ist“
Hallo Hannes,
das mit dem Lebenszeichen sehe ich genauso, man merkt wenigstens, dass etwas vorangeht. Nach dem ganzen Windows8-Push ist der Rest ja etwas in den Hintergrund geraden.
Man merkt auch, dass Projekte aus der Community (Wie z.B. das CORS-Projekt von Brock Allen) in das Framework aufgenommen werden, was ich ebenfalls Klasse finde.
In meinen Augen geht es nicht nur darum, Entwickler aus anderen Bereichen zu locken (was ja gut und schön ist), sondern auch aktuelle .NET Entwickler zu behalten.
OWIN sehe ich als Vorteil, da es in gewisser Hinsicht ein Standard ist, an welchen sich Projekte halten können und somit den Einbau von Komponenten extrem vereinfachen. Man kann ja als Host in OWIN auch den IIS nehmen (Würde ich als produktiv-Szenario ja derzeit auch machen, kein Server-Admin wird mir eine Consolen-App starten ;-)).
Ich finde viel mehr die Middleware-Pipeline, so wie man das z.B. aus NodeJS kennt, einen großen Schritt nach vorne. Damit gemeint sind austauschbare Komponenten (SignalR, WebAPI, Google Auth, usw.), welche an einer zentralen Stelle einfach registriert werden und untereinander kommunizieren können (selbst wenn sie dabei keinerlei Abhängigkeiten voneinander haben).
Wir haben mittlerweile ein Projekt auf das 5er umgestellt, hat problemlos geklappt.
Ich erinnere mich, dass der damalige Umstieg von 3 auf 4 nicht so wichtig war, denn mehr als die neue WebAPI gab es ja nicht. Nun setzen wir auch das AttributeRouting und CORS ein, ich kann es nur empfehlen!
Hallo Marcel,
ich hätte bis jetzt auch keine Probleme gesehen, bis auf die üblichen Änderungen in den Web.Config-Dateien und in manchen Fällen das manuelle Nachziehen von Razor V3.
Der Umstieg lohnt sich, wenn man von den neuen Features Gebrauch machen kann, auf jedem Fall. Ich kann mich auch erinnern, dass mich die 4er Version nicht vom Hocker gehauen hat. Klar, die WebAPI ist schon toll, aber nicht immer notwendig, in ein Projekt nachträglich einzubauen. Dieses Problem wird ja mit OWIN beseitigt 🙂
Coole Übersicht. Es freut mich, wenn es endlich mal was neues bei microsoft gibt. Wurde Zeit!
Wobei vieles halt längst überfällig war und irgendwie halt vieles kopiert wurde.
Besser spät als nie 😉
Ein paar Konzepte sind sicherlich kopiert. Aber: gut kopiert ist besser als schlecht erfunden, gibt es genügend bekannte Beispiele dafür!