Umgang mit Sicherheit / Authentifizierung bei einer DNN-basierten Web-API

8

Ich baue eine REST-API für eine DotNetNuke 6-Website und nutze das DNN MVC-basierte Services Framework. Ich habe jedoch keinen Hintergrund in der Authentifizierung, daher bin ich mir nicht einmal sicher, wo ich anfangen soll.

Grundsätzlich möchten wir, dass unsere Clients GET-Anforderungen für die Daten ihres Portals stellen können, und wir möchten, dass einige Clients (aber nicht alle) einfache Aktualisierungen ihrer Benutzerdaten POSTIEREN können.

Ich habe versucht, nach Informationen zu suchen, aber das Problem ist, dass ich nicht sicher bin, wonach ich suche. DNN hat verschiedene Logins und Rollen, aber ich bin mir nicht sicher, ob und wie sie eingreifen. Ich habe von Dingen wie oAuth gehört, aber mein Verständnis davon ist auf der grundlegendsten Ebene. Ich weiß nicht, ob es das ist, was ich brauche oder nicht und ob oder wie es für DNN gilt. Kann mir jemand in die richtige Richtung zeigen?

UPDATE : Basierend auf der Antwort unten, um es mit einem Modul und weiterer Forschung zu verbinden, habe ich Folgendes getan:

Ich habe ein Modul nur für diesen Dienst erstellt und zwei spezielle Berechtigungen hinzugefügt: "APIGET" und "APIPOST". Diese habe ich einigen Test Rollen / Test Accounts in DNN zugewiesen. Ich schrieb ein benutzerdefiniertes authorize-Attribut, das anhand der Modul-ID überprüft, ob der aktuelle Benutzer über die erforderlichen Berechtigungen verfügt (entweder über Rollen oder direkt). Soweit ich das beurteilen kann, ist Tab ID in meinem Fall irrelevant.

Scheint sowohl mit einem Webbrowser (basierend auf dem DNN-Konto, in dem ich angemeldet bin) als auch mit einem PHP-Skript zu arbeiten, das eine HTTP-Anfrage mit einem Account-Benutzernamen / Passwort sendet.

Das Autorisierungsattribut:

%Vor%

Der Controller: ("Mytest" ist der Endpunkt für GET und POST)

%Vor%     
MysteriousWhisper 16.04.2013, 19:00
quelle

4 Antworten

8

Die Hauptmethode, mit der Sie einen Dienst im DNN Services Framework an DNN-Berechtigungen binden, besteht darin, die Berechtigungen einer Modulinstanz zuzuordnen. Das heißt, Sie benötigen Benutzer Ihres Dienstes, um zu identifizieren, von welchem ​​Modul sie anrufen (indem Sie ModuleId und TabId in der Anfrage senden [Header, Query-String, Cookies, Formular]), dann können Sie angeben, welche Berechtigungen Sie benötigen in diesem Modul eine besondere Aktion für den Dienst.

Sie können das Attribut SupportedModules für Ihren Dienst verwenden und eine durch Kommas getrennte Liste von Modulnamen übergeben, um sicherzustellen, dass nur Ihre eigenen Module zulässig sind. Fügen Sie dann das DnnModuleAuthorize -Attribut auf der Service- oder individuellen Aktionsebene hinzu, um zu sagen, welche Berechtigung der Benutzer für dieses Modul benötigt. In Ihrer Instanz können Sie auch das Attribut AllowAnonymous für die Aktionen GET hinzufügen und ein DnnModuleAuthorize für die Methoden POST (und noch etwas) für den Service. Beachten Sie, dass Sie das Attribut AllowAnonymous nicht auf den Controller setzen können. Es überschreibt die an der Aktion übergebenen Autorisierungen und macht es somit unmöglich, die Aktionen restriktiver zu gestalten.

Sie möchten auch das Attribut ValidateAntiForgeryToken in den Aktionen POST hinzufügen, um sich vor CSRF-Angriffen zu schützen.

Wenn Sie kein Modul haben, das seine Berechtigungen natürlich mit Ihrem Dienst verknüpft, können Sie nur für diesen Zweck einen erstellen, um sich selbst als Berechtigungsverwaltungsdienstprogramm verfügbar zu machen.

Sobald Sie den Autorisierungsteil oben herausgefunden haben, kümmert sich DNN um die Authentifizierung mit Ihrem Formularcookie (d. h. AJAX-Szenarien werden automatisch erledigt) oder über die Basis- oder Digestauthentifizierung (für Nicht-AJAX-Szenarien). Das heißt, wenn Sie Nicht-AJAX durchführen, müssen Sie einen Weg finden, das Anti-Fälschungs-Token nur zu validieren, wenn es angewendet wird.

    
bdukes 17.04.2013, 13:19
quelle
4

Das Services Framework in DNN ist das, wonach Sie suchen. Damit können Sie eine REST-API bereitstellen, die direkt in die DNN-Sicherheit integriert wird.

Hier sind einige Artikel, die Ihnen den Einstieg erleichtern:

Beachten Sie, dass DNN 6 und DNN 7 einige Unterschiede aufweisen, wenn Sie das Services Framework verwenden:

Scott McCulloch 17.04.2013 09:06
quelle
2

Ich möchte nur darauf hinweisen, dass das DnnModuleAuthorize-Attribut einen PermissionKey-Parameter für benutzerdefinierte Berechtigungen verwendet, damit Sie Folgendes tun können:

%Vor%

Es sieht nicht so aus, als könnten Sie damit eine eigene Fehlermeldung angeben, so dass Sie stattdessen Ihren Methodenkörper wie folgt umbrechen und das benutzerdefinierte Berechtigungsattribut weglassen:

%Vor%     
Richard Edwards 16.09.2014 17:55
quelle
1

Ich wollte nur zum @Richards-Kommentar hinzufügen, um die [DnnModuleAuthorize(PermissionKey = "DELETEDATA")] für benutzerdefinierte Berechtigungen zu verwenden.

Das vollständige Attribut sollte lauten:

%Vor%

Wenn Sie das Feld leer lassen, geschieht nichts wie hier gezeigt: Ссылка

    
Ainsof 03.06.2015 23:03
quelle