Za normálnych okolností, keď robíme správu prístupových práv, uložíme základné informácie používateľa po správnom prihlásení v relácii a získame ich vždy, keď používateľ v budúcnosti požiada o stránku alebo rozhranie
Relácia na zistenie a porovnanie, či je prihlásený a či má prístup k aktuálnej stránke.
Princíp relácie spočíva v tom, že na serverovej strane vygeneruje SessionID zodpovedajúce uloženým používateľským dátam, pričom SessionID je uložené v cookie, pričom klient ho prenáša so sebou vždy, keď je o to požiadané
Cookie, server nájde dáta uložené na serverovej strane na základe ID relácie v cookie.
FormsAuthentication poskytuje Microsoft pre nás vývojárov na autentifikáciu. Vďaka tejto autentifikácii môžeme uložiť používateľské meno a niektoré používateľské údaje do cookies,
Základnú autentifikáciu identity a roly je možné ľahko dosiahnuť pomocou základných nastavení podmienok.
Efektom, ktorý sa tu dosiahne, je implementácia kontroly prístupu na základe rolí pomocou systémom poskytovaného Authorize bez použitia členstva.
1. Vytvoriť ticket
Po prihlásení používateľa sa do tiketu uloží jeho ID a zodpovedajúca rola (pre viacero rolí, oddelené).
Zašifrujte ticket pomocou FormsAuthentication.Encrypt.
Uložený šifrovaný tiket je uložený v cookie Response (klient js nemusí tento cookie čítať, preto je najlepšie nastaviť HttpOnly=True, aby sa zabránilo útokom prehliadača pri krádeži a falšovaní cookies). Takto si ho nabudúce môžete prečítať z cookie Request.
Jednoduchá ukážka je nasledovná:
bool isPersistent, //či ponechať (nastaviť podľa potreby, ak je nastavené na perzistencia, nastavenie Expires cookie musí byť nastavené pri odosielaní cookie)
Šiesty parameter FormsAuthenticationTicket ukladá userData reťazca typu, kde je uložené ID roly aktuálneho používateľa, oddelené čiarkou.
Pri prihlásení s používateľským menom "test" sa na klientovi zobrazí log cookie
2. Získať certifikačné informácie
Po prihlásení na stránke s obsahom môžeme získať informácie o uname cez User.Identity.Name aktuálnej požiadavky, alebo môžeme dešifrovať cookie v požiadavke na získanie tiketu a následne získať uname a userData (teda predtým uložené ID roly) z neho.
3. Realizovať kontrolu prístupu k oprávneniam prostredníctvom atribútov anotácií
Konfigurovať Povoliť autentifikáciu formulára a správu rolí vo web.config
Keď pridávame vlastnosti anotácií do Controller a Action, odkiaľ získame nastavenú rolu? Keďže nepoužívame autentifikáciu založenú na členstve, vytvoríme si aj vlastného RoleProvidera. Názov je CustomRoleProvider, ktorý je zdedený od RoleProvider. Tu je vytvorenie vlastného CustomRoleProvider.cs súboru v priečinku Helper pod MVCApp.
V RoleProvider existuje mnoho abstraktných metód a na získanie používateľských rolí implementujeme iba metódu GetRolesForUser. Používateľská rola tu môže byť dotazovaná z databázy podľa získaného používateľského ID alebo podľa toho, ktoré je uložené v relácii či v cookie. Tu som už rolu uložil do userData tiketu, takže ju získame z tiketu.
Ak je to potrebné, pridajte anotačné atribúty do overeného Controller alebo Action, napríklad táto akcia umožňuje prístup len s RoleID 1, 2 alebo 3 a aktuálne používateľské RoleID je (7, 1, 8), čo znamená, že používateľ má právo na prístup.
P.S. :1. Ticket sa ukladá v čase expirácie cookie a ak je prehliadač zatvorený, aby si zapamätal aktuálny ticket, parametre môžu byť nastavené pri inštancii FormsAuthenticationTicket.
2. Získanie Role je možné čítať priamo z databázy bez uloženia v userData ticketu a userData môže ukladať ďalšie informácie.
3. Ak chcete flexibilne konfigurovať povolené prístupové roly Controller a Action, môžete si prispôsobiť metódu OnAuthorization v prepísaní AuthorizeAtribút, kde sa metóda používa
Prečítajte si ID roly, ktoré je povolené na aktuálnej stránke, a skontrolujte ho podľa RoleID aktuálneho používateľa. Týmto spôsobom sa realizuje flexibilná konfigurácia roly.
4. Informácie v tikete sú nakoniec uložené v cookie a bezpečnosť je stále na vašom vlastnom uvážení, osobne si myslím, že je lepšie uložiť UserID a RoleID v relácii.
|