Sto cercando di implementare il controllo degli accessi basato su autorizzazione con il nucleo di aspnet. Per la gestione dinamica di ruoli utente e permessi (create_product, delete_product, ecc.), Vengono memorizzati nel database. Data Model è come http://i.stack.imgur.com/CHMPE.pngCome implementare il controllo degli accessi basato su autorizzazione con Asp.Net Core
Prima nucleo ASPNET (in MVC 5) stavo usando personalizzato AuthorizeAttribute
come qui di seguito per gestire il problema:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
private readonly string _permissionName { get; set; }
[Inject]
public IAccessControlService _accessControlService { get; set; }
public CustomAuthorizeAttribute(string permissionName = "")
{
_permissionName = permissionName;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
var user = _accessControlService.GetUser();
if (PermissionName != "" && !user.HasPermission(_permissionName))
{
// set error result
filterContext.HttpContext.Response.StatusCode = 403;
return;
}
filterContext.HttpContext.Items["CUSTOM_USER"] = user;
}
}
Poi stavo usando in metodo di azione, come di seguito:
[HttpGet]
[CustomAuthorize(PermissionEnum.PERSON_LIST)]
public ActionResult Index(PersonListQuery query){ }
Inoltre, stavo usando HttpContext.Items [ "CUSTOM_USER"] in vista per mostrare o nascondere html parte:
@if (CurrentUser.HasPermission("<Permission Name>"))
{
}
Quando ho deciso di cambiare il nucleo di aspnet, tutto il mio piano era fallito. Perché non esisteva il metodo virtuale OnAuthorization
nello AuthorizeAttribute
. Ho provato alcuni modi per risolvere il problema. Quelli sono qui di seguito:
Usando nuova autorizzazione basato su policy (penso che non è adatto per il mio scenerio)
Utilizzando personalizzati
AuthorizeAttribute
eAuthorizationFilter
(ho letto questo messaggio https://stackoverflow.com/a/35863514/5426333 ma non ho potuto cambiare in modo corretto)Utilizzando middleware personalizzati (come ottenere
AuthorizeAttribute
di corrente azione?) 0.123.
Utilizzando ActionFilter (è corretto per motivi di sicurezza?)
Non riuscivo a decidere quale sia la strada migliore per il mio scenerio e modalità di attuazione.
Prima domanda: l'implementazione di MVC5 è una cattiva pratica?
Seconda domanda: Qualche suggerimento per implementare il nucleo di aspnet?
Perché pensi che l'autorizzazione basata su criteri non sia adatta al tuo caso? Puoi ancora creare 'PermissionRequirement' implementando' IAuthorizationRequirement' e un gestore, quindi aggiungilo come 'options.AddPolicy (" PersonList ", policy => policy.Requirements.Add (new PermissionRequirement (" PersonList ")))' – Tseng
perché , voglio ottenere permessi utente dal database. –
Niente ti impedisce di recuperarli all'interno del gestore. Basta iniettare il tuo contesto/repository/servizio/tutto ciò di cui hai bisogno nel tuo gestore dei requisiti: http://docs.asp.net/en/latest/security/authorization/dependencyinjection.html – Tseng