2016-05-16 13 views
9

Autorizzazione politica Net Core, tuttavia mi sembra molto statica. Perché nell'applicazione Enterprise, è spesso necessario ricorrere a nuovi ruoli che necessitano di nuove politiche (a mio avviso) o se si desidera implementare un nuovo tipo di politica specifica per determinati client. Ad esempio, se stiamo costruendo un CMS che sarà guidato da tali politiche, vorremmo che ogni cliente fosse in grado di definire i propri. Quindi, questo nuovo meccanismo di base delle politiche può essere più dinamico o l'idea è completamente diversa?È possibile che l'autorizzazione basata su criteri sia più dinamica?

grazie :))

+0

Prima di rispondere alla domanda, stavo pensando come te. (Http://stackoverflow.com/questions/36445780/how-to-implement-permission-based-access-control-with-asp-net-core). Ma la risposta di @ Tseng mi ha fatto cambiare idea. La risposta mostra che 'autorizzazione politica' può essere utilizzata dinamicamente. Dai un'occhiata alla risposta, potrebbe essere utile per il tuo caso. –

+0

Non dovresti usare più "ruoli" (come usato in ASP.NET 4.5/MVC 5 prima), usa invece le rivendicazioni. I ruoli non sono molto flessibili e richiedono la modifica del codice ogni volta che si aggiunge un nuovo ruolo.Un reclamo è un permesso specifico basato su una funzionalità della tua applicazione, ad esempio "ReadArticle" o "WriteArticle", "DeleteArticle", "CreateUser" ecc. In questo modo è necessario aggiungere una politica solo quando si aggiunge una nuova funzionalità (come capacità di gestire gli utenti o pubblicare articoli). Un "ruolo sarebbe semplicemente una raccolta di rivendicazioni che un utente ha quando accede. Quindi controlla nella politica – Tseng

+1

Tieni presente che non puoi creare una politica dinamica quando non ce n'era una prima. non posso permettere all'utente di specificare un criterio "over age of 18", se non c'è codice nel backend che lo gestisce (cioè il criterio e il gestore di AgeOver18' che controlla l'età dell'utente). essere creato da un non sviluppatore o da qualcuno che non ha accesso al codice sorgente (poiché è necessario aggiungere controlli a questo criterio specifico nel codice). Invece di creare una nuova politica, si crea un ruolo una raccolta di politiche/permessi esistenti – Tseng

risposta

13

ho sempre raccomandano che le persone date un'occhiata @ il least privilege repo in quanto ha alcuni ottimi esempi di tutti i vari approcci si può prendere con il nuovo ASP.NET core Autenticazione e autorizzazione paradigmi .

Può questo nuovo meccanismo di base delle politiche essere più dinamico?

Sì, in effetti è più dinamico rispetto ai precedenti concetti basati sui ruoli. Ti consente di definire criteri che possono essere guidati dai dati. Here è un'altra grande risorsa per i dettagli relativi a questo. È possibile specificare che un punto di ingresso dell'API, ad esempio, sia protetto da un criterio (ad esempio) e che il criterio possa avere un gestore e che il gestore possa fare tutto ciò di cui ha bisogno, vale a dire; esaminare l'attuale User nel contesto, confrontare le rivendicazioni con i valori nel database, confrontare i ruoli, qualsiasi cosa veramente. Si consideri il following:

definire un punto di voce con il Policy

[Authorize(Policy = "DataDrivenExample")] 
public IActionResult GetFooBar() 
{ 
    // Omitted for brevity... 
} 

Aggiungere l'autorizzazione con le opzioni che aggiungono la politica.

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc();  
    services.AddAuthorization(options => 
    { 
     options.AddPolicy("DataDrivenExample", 
          policy => 
          policy.Requirements.Add(new DataDrivenRequirement())); 
    });  
    services.AddSingleton<IAuthorizationHandler, DataDrivenHandler>(); 
} 

Quindi definire il gestore.

public class MinimumAgeHandler : AuthorizationHandler<DataDrivenRequirement> 
{ 
    protected override void Handle(AuthorizationContext context, 
            DataDrivenRequirement requirement) 
    { 
     // Do anything here, interact with DB, User, claims, Roles, etc. 
     // As long as you set either: 
     // context.Succeed(requirement); 
     // context.Fail(); 
    } 
} 

è l'idea di completamente diverso?

Si deve sentire molto simile ai concetti precedenti che siete abituati a con auth8 e AuthZ.

+0

Grazie, questo è davvero tutto ciò che avevo bisogno di sapere :))) –

6

La risposta accettata è ancora piuttosto limitante. Non consente valori dinamici a livello di controller e di azione. L'unico posto in cui è possibile aggiungere un valore personalizzato è nel requisito quando viene aggiunta la politica. A volte è necessario un controllo più fine sulla procedura di autorizzazione. Uno scenario molto comune è la sicurezza basata sui permessi. Ogni controller e azione dovrebbe essere in grado di specificare le autorizzazioni richieste per accedervi. Vedere la mia risposta here per una soluzione più potente che consente di utilizzare attributi personalizzati per decorare i controller e le azioni con tutte le informazioni necessarie durante l'autorizzazione.

+0

https://github.com/aspnet/Security/issues/1359 dovrebbe affrontare questo – thekip