Under normale omstændigheder, når vi laver adgangsrettighedsstyring, gemmer vi brugerens grundlæggende information efter korrekt login i sessionen og får dem hver gang brugeren anmoder om side- eller interfacedata i fremtiden
Session for at se og sammenligne, om han er logget ind, og om han kan få adgang til den aktuelle side.
Princippet i Session er at generere et SessionID på serversiden, der svarer til de lagrede brugerdata, og SessionID'et gemmes i en cookie, og klienten bærer dette med sig hver gang det anmodes om
Cookie, serveren finder de data, der er gemt på serversiden, baseret på sessions-ID'et i cookien.
FormsAuthentication stilles til rådighed af Microsoft for os udviklere, som kan bruge dem til autentificering. Gennem denne autentificering kan vi gemme brugernavnet og nogle brugerdata i cookies,
Grundlæggende identitets- og rolleautentificering kan nemt opnås gennem grundlæggende betingelsesindstillinger.
Effekten, der opnås her, er at implementere rollebaseret adgangskontrol ved hjælp af den system-leverede Authorize uden at bruge medlemskab.
1. Opret en sag
Efter brugeren logger ind, gemmes brugerens ID og tilsvarende rolle (for flere roller, adskilt) i ticketen.
Krypter billetten med FormsAuthentication.Encrypt.
Gem den krypterede ticket i Response-cookien (klienten js behøver ikke at læse denne cookie, så det er bedst at sætte HttpOnly=True for at forhindre browserangreb i at stjæle og forfalske cookies). På den måde kan du læse det fra Request-cookien næste gang.
En simpel demo er som følger:
bool isPersistent, //if to persist (sæt efter behov, hvis sat til persistence, skal Udløbsindstillingen af cookien være sat ved afsendelse af en cookie)
Den sjette parameter i FormsAuthenticationTicket gemmer userData af typestrengen, hvor rolle-ID'et for den aktuelle bruger gemmes, adskilt af et komma.
Når man logger ind med brugernavnet "test", vises der en log-cookie på klienten
2. Indhent certificeringsoplysninger
Efter at have logget ind kan vi på indholdssiden hente uname-informationen via User.Identity.Name af den aktuelle anmodning, eller vi kan dekryptere cookien i anmodningen for at få ticketen, og derefter hente uname og brugerdata (altså de tidligere gemte rolle-ID-oplysninger) derfra.
3. Realiser adgangskontrol via annotationsattributter
Konfigurér Aktiver formularautentificering og rollestyring i web.config
Når vi tilføjer annotationsegenskaber til Controller og Handling, hvor får vi så sættet Role fra? Da vi ikke bruger medlemskabsbaseret autentificering, vil vi også oprette en brugerdefineret RoleProvider. Navnet er CustomRoleProvider, som er arvet fra RoleProvider. Her er oprettelsen af din egen CustomRoleProvider.cs-fil i Helper-mappen under MVCApp.
Der findes mange abstrakte metoder i RoleProvider, og vi implementerer kun GetRolesForUser-metoden for at få brugerroller. Brugerrollen her kan forespørges fra databasen i henhold til det opnåede bruger-ID eller det, der er gemt i sessionen eller i cookien. Her har jeg allerede gemt rollen i brugerData for ticketen, så lad os hente den fra ticketen.
Hvis nødvendigt, tilføj annoteringsattributter til den validerede Controller eller Handling, for eksempel tillader denne handling kun adgang med et RoleID på 1, 2 eller 3, og den nuværende brugers RoleID er (7, 1, 8), hvilket betyder, at brugeren har ret til adgang.
P.S. :1. Ticket gemmes ved cookie-udløbstidspunktet, og hvis browseren er lukket for at huske den aktuelle ticket, kan parametrene indstilles, når FormsAuthenticationTicket instansieres.
2. Erhvervelsen af Role kan læses direkte fra databasen uden at være gemt i brugerData i ticketen, og userData kan gemme anden information.
3. Hvis du vil konfigurere controlleren og handlingens tilladte adgangsroller fleksibelt, kan du tilpasse OnAuthorization-metoden i AuthorizeAttribut-overridet, hvor metoden bruges
Læs det rolle-ID, der er tilladt på den nuværende side, og tjek det i henhold til den nuværende brugers RoleID. På denne måde realiseres den fleksible konfiguration af rollen.
4. Oplysningerne i ticketen gemmes i sidste ende i cookien, og sikkerheden er stadig op til dig selv; jeg synes personligt, det er bedre at gemme UserID og RoleID i sessionen.
|