7

Sto scrivendo un sistema di archiviazione di file di esempio (esempio solo per stackoverflow).Richieste di autorizzazione per risorse specifiche

I miei modelli di dominio aspetto attuale in quanto tale:

public class User 
{ 
    public int ID { get; set; } 
    public string LoginIdentifier { get; set; } 
    public string Password { get; set; } 
} 

public class File 
{ 
    public int ID { get; set; } 
    public int UserID { get; set; } 
    public string FileName { get; set; } 
    public byte[] Data { get; set; } 
} 

Il codice che sto scrivendo per creare l'IPrincipal:

private static IPrincipal CreatePrincipal(User user) 
{ 
    Debug.Assert(user != null); 

    var identity = new GenericIdentity(user.LoginIdentifier, "Basic"); 

    // TODO: add claims 
      identity.AddClaim(new Claim("Files", "Add")); 

    return new GenericPrincipal(identity, new[] { "User" }); 
} 

Nel mio sistema, un utente può aggiungere file, possono anche recuperare , eliminarli e aggiornarli, tuttavia, l'avvertimento è che un utente può solo recuperare e modificare i propri file (dove File.UserID deve corrispondere all'identità dell'utente connesso).

Il controller di My Files ha il seguente aspetto.

[Authorize] 
public class FilesController : ApiController 
{ 
    private readonly FileRepository _fileRepository = new FileRepository(); 

    public void Post(File file) 
    { 
     // not sure what to do here (...pseudo code...) 
     if (!CheckClaim("Files", "Add")) 
     { 
      throw new HttpError(HttpStatusCode.Forbidden); 
     } 

     // ... add the file 
     file.UserID = CurrentPrincipal.UserID; // more pseudo code... 

     _fileRepository.Add(file); 
    } 

    public File Get(int id) 
    { 
     var file = _fileRepository.Get(id); 

     // not sure what to do here (...pseudo code...) 
     if (!CheckClaim("UserID", file.UserID)) 
     { 
      throw new HttpError(HttpStatusCode.Forbidden); 
     } 

     return file; 
    } 
} 

Forse usando Claim s non è lo strumento giusto per il lavoro, ma spero che questo illustra il problema.

Come collegare i controller per garantire che l'utente attualmente connesso abbia accesso a compiere azioni specifiche e, in particolare, determinate risorse?

risposta

5

Non sono sicuro che le affermazioni siano l'approccio giusto per quello che stai facendo. Quello che vuoi veramente rappresentare sono i permessi. Un reclamo rappresenta generalmente un attributo di identità come nome utente, e-mail o ruoli a cui appartiene, ma non le autorizzazioni. Potresti rappresentare le autorizzazioni con le attestazioni, ma potresti aver bisogno di tonnellate di esso a seconda di quanto è grande la tua applicazione. Un approccio tipico consiste nel mappare un ruolo a un insieme di autorizzazioni (nel tuo caso, aggiungere file sarebbe un permesso). È anche possibile creare un filtro di autorizzazione personalizzato derivante da AuthorizeAttribute per verificare se l'attuale principale ha le autorizzazioni appropriate per eseguire l'azione. Quel filtro potrebbe ricevere le autorizzazioni richieste per eseguire l'azione come argomenti.

+0

in questo caso, penso che l'affermazione sarebbe il 'UserID'. – Matthew

+0

Sì, questo ha senso. È inoltre possibile avere attestazioni per rappresentare i ruoli utente. Quindi si associa un ruolo a un insieme di permessi. Ad esempio, Admin => Aggiungi file, Rimuovi file, ecc. –

5

Pablo ha ragione - afferma di descrivere l'identità. Tuttavia, si utilizza tale identità per giungere a una decisione di autorizzazione. Esiste un'astrazione separata per quella chiamata ClaimsAuthorizationManager.

Date un'occhiata qui: http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

+1

Ho letto questo articolo prima di pubblicare questa domanda, la parte di cui sono preoccupato (e ciò che non ho capito) è il 'ClaimsAuthorization.CheckAccess (" Get "," CustomerId ", id.ToString());' istruzione. Nello specifico, come dovrebbe essere implementata una cosa del genere (nel mio scenario)? – Matthew

+0

È possibile passare "modify/whatever", "file" e il proprietario del file al gestore authZ delle attestazioni. Questo dovrebbe quindi verificare se l'attuale principale corrisponde al proprietario del file. – leastprivilege

Problemi correlati