11.868 messaggi dal 09 febbraio 2002
Contributi

Vorrei implementare maschere con angularjs in attesa di blazor ufficiale. In entrambe i casi immagino che facendo delle call a controllerapi se pongo Authorize scatta in automatico il controllo del cookie rilasciato?

Diciamo di sì. Il cookie viene letto dal middleware di autenticazione che così è in grado di ricreare l'identità dell'utente (User.Identity). Poi, l'attributo Authorize verifica che nell'identità dell'utente ci siano i claim richiesti, tipo il ruolo.


Aggiungerei poi un mio customfilter che verifica altro intercettando l'utente (User.identity) e collegandomi al db per controllare altri dati prima della action

Per esempio?

Enjoy learning and just keep making
270 messaggi dal 13 novembre 2009
una volta loggato tramite il post e signinPasswordAsync verificata l'utente è loggato ma io non ho implementato i claims da nessuna parte, in particolare quello dei ruoli.
Domande:
- il claim del ruolo e tutti gli altri tipo l'azienda di appartenenza dove li implemento?
Nella actionFilter vorrei verificare i claim legendo il ruolo e l'azienda dal db, o è cosa inutile perché sono come i payload con jwt, ovvero anche ipoteticamente mi arrivasse il cookie modificato questo sarebbe non valido!
F
270 messaggi dal 13 novembre 2009
flaviovb ha scritto:
una volta loggato tramite il post e signinPasswordAsync verificata l'utente è loggato ma io non ho implementato i claims da nessuna parte, in particolare quello dei ruoli.
Domande:
- il claim del ruolo e tutti gli altri tipo l'azienda di appartenenza dove li implemento?
Nella actionFilter vorrei verificare i claim legendo il ruolo e l'azienda dal db, o è cosa inutile perché sono come i payload con jwt, ovvero anche ipoteticamente mi arrivasse il cookie modificato questo sarebbe non valido!
F


tipo
var user = await _userManager.FindByEmailAsync(Input.Email);
await _userManager.AddClaimAsync(user, new Claim("test", "Hello"));
var claimsPrincipal = await _signInManager.CreateUserPrincipalAsync(user);
await _signInManager.RefreshSignInAsync(user);
return LocalRedirect(returnUrl);
11.868 messaggi dal 09 febbraio 2002
Contributi

tipo


Oppure così, creandoti un servizio che implementi IUserClaimsPrincipalFactory<TUser>.
https://jimlynn.wordpress.com/2018/06/18/how-do-i-add-new-claims-to-the-claimsprincipal-on-login-with-dotnet-core/

Ci aggiungi i claim che vuoi, così ti eviteranno di fare una query al database.


Nella actionFilter vorrei verificare i claim legendo il ruolo e l'azienda dal db

Vedi se riesci a cavartela solo con l'attributo [Authorize], eventualmente sfruttando le policy.
https://www.aspitalia.com/script/1307/Autorizzazione-Basata-Policy-ASP.NET-Core.aspx

ciao,
Moreno
Modificato da BrightSoul il 02 agosto 2019 01:00 -

Enjoy learning and just keep making
270 messaggi dal 13 novembre 2009
IUserClaimsPrincipalFactory<TUser>...fatto.
Detto questo, ho modificato la tabella Role inserendo la colonna CampanyId, ovvero quando creo un nuovo ruolo prevedo di legarlo ad una azienda. Il sistema di autenticazione lo ho estratto e messo su una dll che verrà utilizzata da piu progetti aspnetcore (siti aziendali dei clienti). La logica di autenticazione e autorizzazione è la stessa ma circa il ruolo, la lista è associata alla azienda cui fa parte l'utente.
La maschera di associazione ruoli/utenza prevederà di filtrare la lista dei ruolo in base alla azienda in cui è censito l'utente. Questa attività la fa o amministratore domini (noi) o l'admin dell'azienda. In questo ultimo caso la lista dei ruoli verrà filtrata per CompanyId.
Questo perché il comportamento del ruolo varia in base all'azienda, l'admin della company1 lavora per la company1, l'admin della company2 di seguito ecc...
A questo punto dovrebbe bastera Authorize(Roles="...") su controller e/o action (sia mvc, sia api - angualrjs/blazor). Ogni sito utilizzando lo stessa logica farà accedere solo gli utenti previsti per quel sito.

Il sistema di verifica in fase di login deve oltre la password verificare che l'utente abbia accesso al dominio. Una tabella prevede associazione utente/dominio.
In fase di login (post) prima di signin PasswordSignInAsync chiamo un metodo in UserStore.CheckDomain(user.name, "dominio che sto navigando) e verifico se l'utente ha accesso restituendo un errore in caso, altrimenti PasswordSignInAsync.
Voorei mettere CheckDomain in UserManager, come posso implementare UserManager aggiungendo un custom method?
O piu semplicemente in UserStore che ho implementato in FindByNameAsync cambio la query e aggiungo elenco dei dominio (proprietà di User) a cui ha accesso utente. Quindi verifico che quello a cui si sta loggando c'è.

Ho una domanda circa il cookie di autenticazione ed i claims. Se un utente passa da un ruolo ad un altro durante la navigazione, durante la login sono Admin, nel frattempo mi cambiano il ruolo. Come verifico il fatto che il claim role passato e risolto durante la richiesta non sia piu valido? Lo verifico tutte le volte collegandomi al database e creando un customauthorize? A quel punto forzerei il signout peraltro
F.
Modificato da flaviovb il 02 agosto 2019 08:06 -
Modificato da flaviovb il 02 agosto 2019 08:09 -
270 messaggi dal 13 novembre 2009
Unable to resolve service for type 'Microsoft.AspNetCore.Identity.RoleManager`1[Microsoft.AspNetCore.Identity.IdentityRole]' while attempting to activate 'Web.Scopes.AppUserClaimsPrincipalFactory`2[Identity.Models.ApplicationUser,Microsoft.AspNetCore.Identity.IdentityRole]'.

questo implementando
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, Scopes.AppUserClaimsPrincipalFactory<ApplicationUser, IdentityRole>>();

prima sono implementati
services.AddTransient<IUserStore<ApplicationUser>, UserStore>();
services.AddTransient<IRoleStore<ApplicationRole>, RoleStore>();
services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
{
options.Password.RequiredLength = 6;
options.Password.RequireLowercase = true;
options.Password.RequireUppercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireDigit = true;
})
.AddDefaultTokenProviders();
Modificato da flaviovb il 02 agosto 2019 10:16 -
270 messaggi dal 13 novembre 2009
E se usassi IClaimsTransformation che scatta dopo l'autenticazione avvenuta?
F.
11.868 messaggi dal 09 febbraio 2002
Contributi
Ciao,


E se usassi IClaimsTransformation che scatta dopo l'autenticazione avvenuta?


Credo che qui il problema non sia la personalizzazione dei claim, ma il fatto che c'è qualcosa che non va nella registrazione dei servizi necessari ad ASP.NET Core.

I servizi (tipo il SignInManager, lo UserManager e così via) vengono registrati quando invochi il metodo AddIdentity che tu hai già messo. Eccolo infatti nel tuo codice:
services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
...


Da qui capisco che tu hai scelto di usare la classe ApplicationUser per rappresentare l'utente e la classe ApplicationRole per rappresentare il ruolo.

Quindi perché qui hai indicato IdentityRole? Non avrebbe dovuto essere ApplicationRole?
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, Scopes.AppUserClaimsPrincipalFactory<ApplicationUser, IdentityRole>>();


Infatti, ASP.NET Core si lamenta del fatto che non è stato registrato alcun RoleManager<IdentityRole>. E'normale che succeda, perché nella tua applicazione è stato invece registrato un RoleManager<ApplicationRole>.

Per il momento quindi usa in maniera coerente i nomi delle classi nelle registrazioni dei servizi, poi vediamo che altro bisogna sistemare.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.