2012-06-20 17 views
9

Sto cercando il pacchetto NuGet che offre funzionalità simili a quelle di CanCan gem in rail (https://github.com/ryanb/cancan).CanCan gem per MVC .NET

Qualcuno conosce un plug-in che fornisce una funzionalità simile? O un modo semplice per implementarlo?

Grazie

+1

avete fatto mai trovare una buona implementazione dell'autorizzazione basata sulle attività? – GraemeMiller

+0

no, sfortunatamente non l'ho fatto. Ho finito per scrivere un attributo Autorizza personalizzato. Fammi sapere se trovi una buona implementazione di esso. – Karan

risposta

0

In .NET si dovrebbe utilizzare Membership Provider e Authorize attributi.

+0

Potrebbe spiegare il downvoter, per favore? –

+2

Non sono il downvoter, ma penso che il motivo per cui questo sia stato downvoted è perché Membership fornisce l'autorizzazione per i ruoli, piuttosto che le autorizzazioni per un'attività. Forse ho sbagliato, ma con Cancan ho avuto la possibilità di limitare l'accesso per eseguire una determinata azione definendo la "capacità" di fare qualcosa sul file dell'abilità. Diciamo che ho una risorsa immagine e utenti, e un utente vorrebbe * modificare * l'immagine - avrei bisogno di metterlo in un ruolo di editing con i fornitori di appartenenza? Con cancan posso semplicemente aggiungere un codice che dice: "L'utente ha il permesso di * modificare * una risorsa immagine se la possiede" – Karan

+0

Questo tipo di logica può essere implementato con l'attributo personalizzato "Autorizza". –

3
0

Verificare this page nella documentazione di ASP.NET Core. È in qualche modo simile a ciò che cancan fa.

È scrivere un gestore di autorizzazione in questo modo:

public class DocumentAuthorizationHandler : 
     AuthorizationHandler<OperationAuthorizationRequirement, Document> 
    { 
     public override Task HandleRequirementAsync(AuthorizationHandlerContext context, 
                OperationAuthorizationRequirement requirement, 
                Document resource) 
     { 
      // Validate the operation using the resource, the identity and 
      // the Name property value from the requirement. 

      return Task.CompletedTask; 
     } 
    } 

Ora è possibile utilizzare il seguente codice nel vostro controller:

if (await authorizationService.AuthorizeAsync(User, document, Operations.Read)) 
    { 
     return View(document); 
    } 
    else 
    { 
     return new ChallengeResult(); 
    } 

o in vostro punto di vista:

@if (await AuthorizationService.AuthorizeAsync(User, Model, Operations.Edit)) 
    { 
     <p><a class="btn btn-default" role="button" 
      href="@Url.Action("Edit", "Document", new { id = Model.Id })">Edit</a></p> 
    }