2011-01-07 7 views
0

Ich bin ein relativer MVC-Noob von WebForms. Ich denke, dass ich MVC mit ein paar Ausnahmen ziemlich gut verstehe, und ich denke, dass ich das Muster gebrochen haben könnte. Ich werde versuchen, das kurz zu halten, also nehme ich an, dass das meiste von dem, was ich verlange, relativ offensichtlich ist.MVC2 Routing und Sicherheit: Wie können Parameter sicher übergeben werden?

Sagen wir, ich habe eine Nachrichtenseite mit Artikeln. In diesem Fall funktioniert eine URL in Form von mynewssite.com/Articles/123 einfach großartig, weil es mir egal ist, wer welchen Artikel anzeigt. Der Benutzer kann die ArticleID in der URL zu dem ändern, was er will, und diesen Artikel aufrufen. In meinem Fall möchte ich jedoch nur, dass der Benutzer Datenelemente (Artikel oder was auch immer), die zu ihnen gehören, anzeigen/bearbeiten kann. Um dies zu erreichen, verwende ich ihre Benutzer-ID (GUID) als Fremdschlüssel in der Datenbank und zeige eine Liste ihrer Daten an, aus denen sie auswählen können. Hier kommt das Problem ... wenn sie auf den Link klicken, der von Url.Action erstellt wurde ("Bearbeiten", Neu mit {.id = item.id}) (Ich verwende nicht ActionLink, weil ich HTML-Inhalt hinzufügen muss innerhalb des Links) wird die ID als Querystring-Parameter angezeigt. Ich könnte eine Route dafür hinzufügen, aber die ID würde immer noch in der URL erscheinen, an der sie manipulieren könnten. Die offensichtliche Implikation ist, dass sie durch Manipulation der URL eine beliebige Entität anzeigen/bearbeiten können, die sie möchten.

Was fehlt mir? Gibt es eine gute Möglichkeit, die Parameter zu übergeben, ohne sie auf der URL hinzuzufügen? Ich weiß, dass ich sie in eine Form auf der Seite bringen und das Formular einreichen kann, aber das scheint für mein Beispiel schwerfällig zu sein, und ich benutze jQuery.ajax an Orten, die mit dieser Idee zu kollidieren scheinen. Ich könnte auch ihre UserID gegen die Daten in der Edit-Methode überprüfen, aber das scheint auch umständlich.

Ist diese Frage zu breit? Bitte lassen Sie mich wissen, welche Besonderheiten Sie benötigen. Vielen Dank.

Antwort

0

Auch in Winforms müssen Sie bei jeder Anfrage eine spezielle Logik hinzufügen, um nur die Artikel zu filtern, die der Benutzer besitzt. Ich verstehe nicht, warum MVC anders sein sollte. Sicher, Sie können web.config verwenden, um den Zugriff auf bestimmte URLs zu verweigern, jedoch nicht, wenn Sie eine einzelne Seite verwenden, die einen Parameter der anzuzeigenden Daten verwendet.

Ihre beste Wette ist wahrscheinlich, dies auf Datenbankebene zu filtern. Durch Hinzufügen einer WHERE-Klausel, die die Benutzer-ID enthält, gibt die App den Fehler "keine Datensätze gefunden" zurück, und Sie können damit machen, was Sie wollen.

0

Sie könnten forms authentication verwenden. Auf diese Weise wird, wenn sich der Benutzer authentifiziert, ein verschlüsselter Cookie ausgegeben, der seinen Benutzernamen enthält, der nicht manipuliert werden kann. Dann können Sie überprüfen, ob der aktuell verbundene Benutzer berechtigt ist, diesen Artikel zu bearbeiten.

+0

Vielen Dank für Ihre Antwort. Ich verwende die Formularauthentifizierung. Ich denke nur nicht, dass ich überprüfen sollte, ob der Benutzer die Berechtigung für diese Daten bei jeder Anfrage hat. Vielleicht liegt es daran, dass ich an WebForms gewöhnt bin, wo ich einfach einen Ordner (mit FA) sichern kann und damit fertig bin. Meine Hauptfrage ist, was ist der MVC beste/Standard Art der Parameter in dieser Art von Situation zu übergeben. Ich möchte sicherstellen, dass ich MVC richtig einsetze. –