Įprastomis aplinkybėmis, kai atliekame prieigos teisių valdymą, išsaugosime pagrindinę vartotojo informaciją po teisingo prisijungimo sesijoje ir gausime ją kiekvieną kartą, kai vartotojas ateityje paprašys puslapio ar sąsajos duomenų
Sesija, skirta pamatyti ir palyginti, ar jis prisijungęs ir ar gali pasiekti dabartinį puslapį.
Sesijos principas yra generuoti SessionID serverio pusėje, atitinkantį saugomus vartotojo duomenis, o SessionID saugomas slapuke, ir klientas jį nešiojasi su savimi kiekvieną kartą, kai to prašoma
Slapukas, serveris randa serverio pusėje saugomus duomenis pagal slapuke esantį sesijos ID.
"FormsAuthenticing" teikia "Microsoft", kad galėtume naudoti mums, kūrėjams, autentifikavimui. Naudodami šį autentifikavimą galime išsaugoti vartotojo vardą ir kai kuriuos vartotojo duomenis slapukuose,
Pagrindinį tapatybės ir vaidmens autentifikavimą galima lengvai pasiekti naudojant pagrindinius sąlygų nustatymus.
Čia reikia įdiegti vaidmenimis pagrįstą prieigos valdymą naudojant sistemos pateiktą autorizaciją nenaudojant narystės.
1. Sukurkite bilietą
Vartotojui prisijungus, vartotojo ID ir atitinkamas vaidmuo (keliems vaidmenims atskirai) saugomi biliete.
Užšifruokite bilietą naudodami FormsAuthentication.Encrypt.
Išsaugokite užšifruotą bilietą atsakymo slapuke (klientui js nereikia skaityti šio slapuko, todėl geriausia nustatyti HttpOnly=True, kad naršyklės atakos nevogtų ir nesuklastotų slapukų). Tokiu būdu kitą kartą galėsite jį perskaityti iš užklausos slapuko.
Paprasta demonstracinė versija yra tokia:
bool isPersistent, //or to remain (nustatykite pagal poreikį, jei nustatyta į pastovumą, siunčiant slapuką reikia nustatyti slapuko galiojimo pabaigos nustatymą)
Šeštasis FormsAuthenticationTicket parametras saugo eilutės tipo vartotojo duomenis, kuriuose saugomas dabartinio vartotojo vaidmens ID, atskirtas kableliu.
Prisijungus su vartotojo vardu "test", kliente pasirodo žurnalo slapukas
2. Gaukite sertifikavimo informaciją
Prisijungę turinio puslapyje galime gauti "uname" informaciją naudodami dabartinės užklausos User.Identity.Name arba galime iššifruoti slapuką užklausoje gauti bilietą, o tada iš jo gauti "uname" ir "userData" (tai yra anksčiau saugomą vaidmens ID informaciją).
3. Realizuokite leidimų prieigos valdymą naudodami komentarų atributus
Formos autentifikavimo ir vaidmenų valdymo įgalinimo konfigūravimas web.config
Kai pridedame anotacijos ypatybes prie valdiklio ir veiksmo, iš kur gauname nustatytą vaidmenį? Kadangi nenaudojame naryste pagrįsto autentifikavimo, taip pat sukursime pasirinktinį RoleProvider. Pavadinimas yra CustomRoleProvider, kuris yra paveldėtas iš RoleProvider. Čia yra savo CustomRoleProvider.cs failo sukūrimas MVCApp aplanke "Helper".
RoleProvider yra daug abstrakčių metodų, o vartotojų vaidmenims gauti diegiame tik GetRolesForUser metodą. Vartotojo vaidmens čia galima užklausti iš duomenų bazės pagal gautą vartotojo ID arba tą, kuris saugomas sesijoje arba saugomas slapuke. Čia aš jau išsaugojau vaidmenį vartotojo duomenys, todėl gaukime jį iš bilieto.
Jei reikia, pridėkite anotacijos atributus prie patvirtinto valdiklio ar veiksmo, pavyzdžiui, šis veiksmas leidžia prieigą tik su RoleID 1, 2 arba 3, o dabartinis vartotojas RoleID yra (7, 1, 8), o tai reiškia, kad vartotojas turi prieigos teisę.
P.S. :1. Bilietas saugomas slapuko galiojimo laiku, o jei naršyklė uždaryta, kad įsimintų dabartinį bilietą, parametrus galima nustatyti sukūrus FormsAuthenticationTicket.
2. Vaidmens įsigijimas gali būti nuskaitomas tiesiai iš duomenų bazės, nesaugomas bilieto vartotojo duomenyse, o vartotojo duomenys gali saugoti kitą informaciją.
3. Jei norite lanksčiai konfigūruoti valdiklio ir veiksmo leidžiamos prieigos vaidmenis, galite tinkinti OnAuthorization metodą AuthorizeAttribute nepaisyme, kuriame naudojamas metodas
Perskaitykite vaidmens ID, kuris leidžiamas dabartiniame puslapyje, ir patikrinkite jį pagal dabartinio vartotojo RoleID. Tokiu būdu realizuojama lanksti vaidmens konfigūracija.
4. Biliete esanti informacija galiausiai saugoma slapuke, o saugumas vis tiek yra jūsų nuožiūra, aš asmeniškai manau, kad geriau saugoti "UserID" ir "RoleID" sesijoje.
|