Archiv für den Monat Juni 2011

ASP.NET MVC 3 Nutzer Authentication mit Attributen


Bei einer Webseite mit einer Nutzerverwaltung, ist mit das wichtigste das man nicht einfach die Daten anderer User betrachten darf oder sich Zugriff zum Adminbereich verschafft, nur weil man etwas mit der URL “umherspielt”.

Dafür gibt es zum einen das Attribut “Authorize” was direkt mitgeliefert wird und prinzipiell prüft, ob überhaupt ein User eingeloggt ist und wenn nicht wird auf die Loginseite verwiesen.

Dann besteht aber noch die Möglichkeit ein Custom Attribut zu erstellen, in dem man alle wichtigen Daten für den aktuellen Controller und den Aufgerufenen View überprüfen kann.

Zum einen haben mir hier die folgenden Links sehr weitergeholfen:

http://msdn.microsoft.com/en-us/library/gg416513%28VS.98%29.aspx

http://msdn.microsoft.com/en-us/library/dd381609%28v=VS.98%29.aspx

http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

Dann noch ein kleines Beispiel wie so eine Umsetzung aussehen könnte. Als erstes benötigen wird eine neue Klasse die vom AuthorizeAttribute ableitet und wir können hier eigene Werte im Konstruktor übergeben, die wir evtl. später benötigen. Dann muss man noch OnAuthorization überschreiben und kann hier seine gewünschte Funktionalität einbinden.

image

Mit der Hilfe von filterContext.Result und mit HttpUnauthorizedResult() wird auf die Loginseite verwiesen, kann auch in einem der oberen Links nachgelesen werden.

image

oder mit new RedirectResult(“BeliebigeURL”) kann auch direkt auf eine URL verwiesen werden.image

Das Attribut kann dann in jedem beliebigen Controller eingesetzt werden und wird vor allen anderen Attributen ausgeführt.

image

Entity Framework und Enums


Leider werden bisher keine Enums vom EF unterstützt, daher gehe ich z.B. den folgenden Umweg um zumindest das “Gefühl” zu haben das ich Enums in meinen Objekten nutzen kann.

Dazu erstelle ich ein Property (UserTypeId) als Int32 in meiner EF Klasse und setzte den Getter und Setter in den Eigenschaften des Properties auf Private.

image

image

Dann lege ich der in der zugehörigen Partial Class ein Property für meinen Enum an und weise hier die UserTypeId zu bzw. parse aus der hinterlegten UserTypeId den passenden Enum Wert.

image

EF Datenbank Update Skripte generieren


Es ist zwar leicht mit Hilfe des Entity Frameworks neue Anwendungen zu schreiben, aber leider wird von Haus aus nur das Generieren von SQL Statements unterstützt die, die Datenbank neu erstellen und somit nicht als Updateskripte genutzt werden können. Zum Glück gibt es dafür ein Tool, das “Entity Designer Database Generation Power Pack”, welches man unter

http://visualstudiogallery.msdn.microsoft.com/df3541c3-d833-4b65-b942-989e7ec74c87/view/Reviews/

herunterladen kann. Leider gibt es hier nur selten Updates und das Tool läuft teilweise nicht so wie beschrieben. Daher hier ein paar Tipps damit Ihr die Funktionen trotzdem nutzen könnt.

Sobald Ihr das Tool installiert habt, stehen euch weitere Workflows zur SQL-Skript Generierung zur Verfügung, der folgende Link beschreibt wie es normalerweise funktionieren sollte

http://blogs.msdn.com/b/adonet/archive/2010/02/08/entity-designer-database-generation-power-pack.aspx

Wenn es so nicht klappt, weil Ihr einfach nicht das angegeben Fenster bekommt, … dann hier ein paar Tipps die Ihr versuchen könnt um auch in den Genuss der automatischen Updateskripte zu kommen.

Wenn Ihr ein Updateskript erstellen wollt, dann am besten unter den Eigenschaften des Datenmodells “Generate Migration T-SQL.xaml” einstellen und es wird wie bisher ein Skript erstellt welches Ihr selbst ausführen könnt.

image

Damit die Erstellung dafür funktioniert, muss ebenfalls noch die SQL-Verbindung zu eurer Datenbank im Lokalen Projekt gespeichert werden, denn wenn dies nicht eingestellt wurde, kann beim Erstellen des Skriptes nicht auf die alte DB zugegriffen werden und die Erstellung schlägt fehl.

image

Das Script wird dann erstellt über “Datenbank aus Modell generieren…” (Hier kann es sein das ein neuer Dialog erscheint, wie in der externen Anleitung für das Tool beschrieben wurde. Ihr könnt aber kein Script auswählen, dann einfach nur auf weiter gehen und es wird das Script zur Erstellung einer neuen Datenbank genommen was Ihr bereits direkt in den Eigenschaften weiter oben eingestellt habt.)

image

Wenn das SQL Skript dann erstellt wurde und Ihr es ausführen wollt, dürft Ihr nicht vergessen noch den SQL-Command Mode einzuschalten (wird für das erstellte SQL Skript benötigt), das muss im VS oder auch im SQL Management Studio jedes mal gemacht werden.

image

Außerdem hat der Updategenerator noch “Probleme” das er nicht erkennt wenn Ihr einen Defaultwert für ein neues Property gesetzt habt und zeigt euch einen Fehler an, das das Script nicht ausgeführt werden kann, da es zu einem Datenverlust führt.

Hier müsste Ihr selbst nach den Updateroutinen für die Tabellen suchen und “Default” Value selbst dem Skript hinzufügen.

image

Dann noch die Fehlermeldungen am Anfang des Skriptes entfernen und schon habt ihr ein funktionierendes Updateskript für euer EF Modell.

Entity Framework – Vererbung und Abfragen


Gegeben sei ein einfaches Datenmodell EFDataType als Basisklasse und EFUser der von EFDataType erbt, siehe Abbildung.

image

Dann sieht eine passende Abfrage folgendermaßen aus, um z.B. nach dem User mit der Mailadresse “jr@gmx.de” zu suchen.

image

Es wird jetzt OfType<EFUser>() verwendet um die Abfrage direkt für den EFUser ausführen zu können.

Eine Abfrage ohne Vererbung für den AzUser für den Nutzer mit der Emailadresse “jr@gmx.de” sehen wir im Folgenden.

image

image

ASP.NET MVC 3 – Lokalisierung


Die Lokalisierung für das Display Attribut ist nativ ab ASP.NET MVC 3 möglich. Aber auch hier kann man noch auf Probleme beim Einbinden stoßen, auf die ich im Folgenden hinweisen möchte.

image

Das Display Attribut für das Property “OldPassword”, ist in meiner Resourcendatei  “AccountViews.resx” abgelegt und ich habe diese unter den App_GlobalResources abgelegt.

image

Wenn man aber die Resourcen Datei direkt unter den App_GlobalResources versucht anzulegen, war es mir hier nicht möglich, den Zugriffsmodifizierer zu setzen (dieser war deaktiviert und war auf “internal” gestellt), daher habe ich die Resource einfach unter einem anderen Ordner im Projekt angelegt und konnte dann den Zugriffsmodifizierer auf Public setzten.

Denn wenn dieser nicht auf Public gesetzt ist, ist es nicht möglich die Resourcen für das Display Attribut abzurufen und man bekommt beim Anzeigen der Seite einen Zugriffsfehler.

image

 

Es ist aber kein Problem die Datei nachdem man diese angelegt hat in das App_GlobalResources Verzeichnis zu verschieben.

Wenn man z.B. die “AccountViews.Designer.cs” Datei öffnet, sieht man auch den generierten Code und die Properties müssen Public sein und nicht Internal, damit auch im Display Attribut auf die Resourcen zugegriffen werden kann.

image

So einfach kann Lokalisierung mit ASP.NET MVC 3 sein.

Update 10.08.2012:

Ein Neuer Beitrag von mir wie man den Modifizierer noch auf “Public” setzten kann.