L'autenticazione basata su criteri rimuove la sicurezza di refactoring?

-1

Comprendo la Sicurezza basata sui ruoli . Ho letto su Basato su criteri . Ho letto ciò che altri chiama Basato su attività .

Quello che voglio sapere è se faccio policy-based, sto evitando ciò che richiede il ruolo e ciò che sembra basato sull'attività: sicurezza hardcoding, refactor a causa di qualche nuovo requisito, hardcode un po 'di più, e così via .

Vedo la differenza tra il ruolo e le attività basate. Il mio obiettivo è non avere gruppi codificati in un metodo come Admin, SuperAdmin, SuperSuperAdmin, ecc.

Penso, ma non sono sicuro se Policy Based fa quello che voglio, ma non riesco a capire come. Come sono questi tre diversi?

Se utilizzo l'esempio Under21 per i criteri che ho visto molte volte su vari blog, ho:

[Authorize(Policy = "AtLeast21")]

In che modo questo è diverso da:

[Authorize(Roles = "SuperAdministrator, ChannelAdministrator")]
public class ChannelAdministrationController: Controller
{
}

E basato sulle attività (questo Basato sul contesto ?) è diverso ma appare più "semanticamente" preciso. Hai un'attività UpdateUser e probabilmente non è probabile che tu abbia Attività SuperUpdateUser. Ma con le politiche, sembra che tu possa avere lo stesso ruolo di più ruoli. So che ci possono essere molti reclami utilizzati l'autenticazione e l'autorizzazione, ma tutto quello che posso pensare è che potrebbe esserci un nome migliore di Over21 per la mia politica e creare un ruolo di cui ha bisogno il mio reclamo. Ma da qualche parte nella parte posteriore, devo creare quelle attività e ruoli e utenti. Anche Role Based ha delle regole che posso usare in .NET Core Middleware, quindi sono confuso.

Ad esempio, potrei facilmente richiedere un criterio aggiuntivo,

[Authorize(Policy = "AtLeast21", "ExceptInTenneseeWithParent", "ExceptInChurch")]

Questa è la mia risposta (dalla pagina MS)?

services.AddAuthorization(options =>
{
    options.AddPolicy("BadgeEntry", policy =>
        policy.RequireAssertion(context =>
            context.User.HasClaim(c =>
                (c.Type == ClaimTypes.BadgeId ||
                 c.Type == ClaimTypes.TemporaryBadgeId) &&
                 c.Issuer == "https://microsoftsecurity")));
});

Torno di nuovo ai requisiti hardcoding.

La mia domanda è: in cosa differiscono?

Inoltre, la sicurezza basata sulle policy mi impedisce di dover aggiungere un nuovo ruolo o criterio ogni volta che viene fuori qualcosa di nuovo (vedi i miei esempi sopra). L'attività basata fa (sembra).

"Why do you believe that Role-Based Security is tightly coupled, while Policy-Based Security is not?"

Non sono sicuro che non lo sia. Questo è il motivo per cui ti sto chiedendo perché qualcosa non mi sta aggiungendo. Mentre questo non va bene,

[Authorize(Roles="Administrator, SuperAdministrator, 
CertainBosses, SomeGuyinHR, SuperDuperAdministrator")]

Non sono convinto che la politica sia migliore,

perché devo cambiare il mio gestore con i condizionali. L'unica cosa che posso pensare è in Policy-based puoi avere un set di codice più auto-documentante che non cambia in base a un nuovo ruolo di sicurezza.

[Authorize(Policy="UpdateUser")]

e nella tua politica,

...administrator || some_user || something else

o alcune nuove norme impilate

[Authorize(Policy="UpdateUser")]
[Authorize(Policy="UpdateUserIfYouAreX")]

o nel database

...is the user in the database that has my roles

e modifica tutte le informazioni sul mio ruolo nel database.

Basato sull'attività sembra più simile all'ultima progettazione di policy:

(da lostechies)

[HandleError]
 public class HomeController : Controller
 {
     [Authorize(Activity = "Administrators Only")]
     public ActionResult AdministratorsOnly()
     {
         return View();
     }
 }
    
posta johnny 11.01.2018 - 18:57
fonte

1 risposta

1

La tua domanda sembra dipendere dall'idea che l'attributo Authorize in

[Authorize(Roles = "SuperAdministrator, ChannelAdministrator")]
public class ChannelAdministrationController: Controller
{
}

deve essere configurabile. Non è così. È improbabile che tali ruoli cambino. Ciò che è più probabile che cambino sono i ruoli assegnati a un particolare utente.

If I use the Under21 example for Policy Based I have seen many times on various blogs, I have:

[Authorize(Policy = "AtLeast21")]

How is this different from:

[Authorize(Roles = "SuperAdministrator, ChannelAdministrator")]
public class ChannelAdministrationController: Controller
{
}

Dal punto di vista della manutenibilità, non sono diversi. La modifica di uno dei due richiede una modifica del codice. Tuttavia, se è solo questione di cambiare l'età, potresti fare qualcosa di simile:

public void ConfigureServices(IServiceCollection services)
{
    // get minimum age from some configuration service or class
    var age = configuration.GetMinimumAge();

    services.AddMvc();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("MinimumAge", policy =>
            policy.Requirements.Add(new MinimumAgeRequirement(age)));
    });
}

E poi, se vuoi cambiare l'età minima, puoi semplicemente cambiare il valore nella configurazione, piuttosto che cambiare il codice e ridistribuire, anche se potrebbe essere necessario un riavvio dell'applicazione web per raccogliere la modifica .

    
risposta data 11.01.2018 - 21:33
fonte

Leggi altre domande sui tag