2013-04-16 7 views
8

Sto costruendo un'API REST per un sito Web DotNetNuke 6, facendo uso del framework di servizi basato su MVC di DNN. Tuttavia, non ho alcun background in autenticazione, quindi non sono nemmeno sicuro da dove cominciare.Come gestire la sicurezza/autenticazione su un'API Web basata su DNN

Fondamentalmente, vogliamo che i nostri clienti siano in grado di effettuare richieste GET per i dati del loro portale e vogliamo che alcuni client (ma non tutti) siano in grado di pubblicare semplici aggiornamenti POST ai loro dati utente.

Ho cercato di cercare informazioni, ma il problema è che non sono sicuro di cosa sto cercando. DNN ha diversi accessi e ruoli, ma non sono sicuro se o in che modo entrano in gioco. Ho sentito parlare di cose come oAuth ma la mia comprensione di questo è al livello più elementare. Non so se è ciò di cui ho bisogno o no e se o come si applica a DNN. Qualcuno può indicarmi la giusta direzione?

UPDATE: Sulla base della risposta qui sotto su legandola con un modulo e ulteriori ricerche, qui è quello che ho fatto:

ho creato un modulo solo per questo servizio, e ho aggiunto due permessi speciali per questo: "APIGET" e "APIPOST." Li ho assegnati ad alcuni ruoli di prova/account di prova in DNN. Ho scritto un attributo di autorizzazione personalizzato che, dato l'ID del modulo, controlla se l'utente corrente ha i permessi necessari (attraverso i ruoli o direttamente). Per quanto posso dire, l'ID della scheda è irrilevante nel mio caso.

Sembra che funzioni sia con un browser Web (basato sull'account DNN in cui sono connesso) sia con uno script php che invia una richiesta HTTP con un nome utente/password dell'account.

L'attributo autorizzare:

using DotNetNuke.Entities.Modules; 
using DotNetNuke.Entities.Portals; 
using DotNetNuke.Security; 
using DotNetNuke.Security.Permissions; 
using System.Web; 

public class MyAuthorize : DotNetNuke.Web.Services.AuthorizeAttributeBase 
{ 
    public const string AuthModuleFriendlyName = "MyAuthModule"; 
    public const string GETPermission = "APIGET"; 
    public const string POSTPermission = "APIPOST"; 

    public string Permission { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase context) 
    { 
     ModuleController mc = new ModuleController(); 

     ModuleInfo mi = mc.GetModuleByDefinition(PortalController.GetCurrentPortalSettings().PortalId, AuthModuleFriendlyName); 

     ModulePermissionCollection permCollection = mi.ModulePermissions; 

     return ModulePermissionController.HasModulePermission(permCollection, Permission); 
    } 
} 

Il controller: ("mytest" è il punto finale sia per GET e POST)

public class MyController : DnnController 
{ 
    [ActionName("mytest")] 
    [AcceptVerbs(HttpVerbs.Get)] 
    [DnnAuthorize(AllowAnonymous = true)] 
    [MyAuthorize(Permission = MyAuthorize.GETPermission)] 
    public string myget(string id = "") 
    { 
     return "You have my permission to GET"; 
    } 

    [ActionName("mytest")] 
    [AcceptVerbs(HttpVerbs.Post)] 
    [DnnAuthorize(AllowAnonymous = true)] 
    [MyAuthorize(Permission = MyAuthorize.POSTPermission)] 
    public string mypost(string id = "") 
    { 
     return "You have my permission to POST"; 
    } 
} 
+2

controllo gentile questo potrebbe essere utile http://stackoverflow.com/questions/12222527/web- api-authentication-best-practice – Gajendra

risposta

8

Il modo principale in cui si associa un servizio in DNN Services Framework alle autorizzazioni DNN consiste nell'associare le autorizzazioni con un'istanza del modulo. Cioè, dovrai chiedere agli utenti del tuo servizio di identificare il modulo da cui stanno chiamando da/about (inviando ModuleId e TabId nella richiesta [intestazioni, stringa di query, cookie, modulo]), quindi puoi indicare quali permessi hanno bisogno di quel modulo per intraprendere un'azione particolare sul servizio.

È possibile utilizzare l'attributo SupportedModules sul servizio e immettere un elenco delimitato da virgole dei nomi dei moduli, per garantire che siano consentiti solo i propri moduli.Quindi, aggiungi l'attributo DnnModuleAuthorize al servizio o il livello di azione individuale per dire quale autorizzazione l'utente ha bisogno per quel modulo. Nella tua istanza, puoi anche aggiungere l'attributo AllowAnonymous alle azioni GET e avere uno DnnModuleAuthorize sul servizio, per i metodi POST (e qualsiasi altra cosa). Si noti che non è possibile inserire l'attributo AllowAnonymous sul controller; annullerà le autorizzazioni messe in atto, rendendo impossibile rendere le azioni più restrittive.

Inoltre, si desidera aggiungere l'attributo ValidateAntiForgeryToken alle azioni POST, per proteggersi dagli attacchi CSRF.

Se non si dispone di un modulo che associa in modo naturale le autorizzazioni al servizio, è possibile crearne uno solo per tale scopo, esclusivamente per esporsi come utilità di gestione delle autorizzazioni.

Una volta individuata la parte di autorizzazione sopra, DNN si prenderà cura dell'autenticazione tramite il cookie dei moduli (ad esempio, gli scenari AJAX sono gestiti automaticamente) o tramite l'autenticazione di base o digest (per scenari non AJAX). Detto questo, se stai facendo non AJAX, dovrai trovare un modo per convalidare il token anti-contraffazione solo quando si applica.

+0

Ho capito come scrivere un modulo DNN con permessi personalizzati. Ma sono nuovo di DNN e non sono ancora chiaro su come i nostri client verranno autenticati quando si collegano a livello di codice all'API e come questo si collega al modulo. Non ho idea di dove AJAX entri in gioco. Potresti essere più specifico? – MysteriousWhisper

+0

Brian, hai qualche esempio di questo codice per favore? – Rodney

+1

La cartella 'Esempi di progetti' in https://github.com/bdukes/Designing-a-Mobile-Enabling-API ha un modulo e un'app di Windows Phone – bdukes

4

Services Framework in DNN è che cosa siete dopo. Ti consente di fornire un'API REST che si collega direttamente alla sicurezza DNN.

Ecco alcuni articoli per aiutarti a iniziare:

Nota, ci sono alcune differenze in DNN 6 e DNN 7 quando si utilizza il Framework Servizi:

2

Volevo solo sottolineare che l'attributo DnnModuleAuthorize prende un parametro PermissionKey per autorizzazioni personalizzate in modo da poter fare cose come questa:

[DnnModuleAuthorize(PermissionKey = "DELETEDATA")] 
    [HttpPost] 
    public HttpResponseMessage DeleteData(FormDataCollection data) 

Non sembra, come si può fornire il proprio messaggio di errore con questo modo si potrebbe avvolgere il corpo metodo come questo invece e lasciare fuori l'attributo un'autorizzazione personalizzata:

[DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.View)] 
    [HttpPost] 
    public HttpResponseMessage DeleteData(FormDataCollection data) 
    { 
     var errorMessage = "Could not delete data"; 

     if (ModulePermissionController.HasModulePermission(ActiveModule.ModulePermissions,"DELETEDATA")) 
     { 
      // do stuff here 
     } 
     else 
     { 
      errorMessage = "User does not have delete permission"; 
     } 

     var error = new HttpResponseMessage(HttpStatusCode.BadRequest) 
     { 
      Content = 
       new StringContent(
       errorMessage) 
     }; 
     return error; 
    } 
+0

Snippet di codice piacevole! :) –

1

volevo solo aggiungere alla @Richards commento per l'utilizzo del [DnnModuleAuthorize(PermissionKey = "DELETEDATA")] per le autorizzazioni personalizzate.

L'attributo completo dovrebbe essere:

[DnnModuleAuthorize(PermissionKey = "DELETEDATA", AccessLevel = SecurityAccessLevel.Edit)] 

Lasciando vuoto non fa nulla come illustrato di seguito: https://github.com/dnnsoftware/Dnn.Platform/blob/f4a5924c7cc8226cfe79bbc92357ec1a32165ada/DNN%20Platform/Library/Security/Permissions/PermissionProvider.cs#L810

Problemi correlati