Normaaleissa olosuhteissa, kun teemme käyttöoikeuksien hallintaa, tallennamme käyttäjän perustiedot oikean kirjautumisen jälkeen sessiossa ja saamme ne aina, kun käyttäjä pyytää sivu- tai käyttöliittymätietoja tulevaisuudessa
Istunto nähdä ja vertailla, onko hän kirjautunut sisään ja pääseekö hän käsiksi nykyiselle sivulle.
Sessionin periaate on luoda palvelinpuolelle SessionID, joka vastaa tallennettuja käyttäjätietoja, ja SessionID tallennetaan evästeeseen, ja asiakas kantaa sitä mukanaan aina, kun sitä pyydetään
Eväste, palvelin löytää palvelimen puolelta tallennetut tiedot evästeen istuntotunnuksen perusteella.
FormsAuthentication on Microsoftin tarjoama meille kehittäjille autentikointiin. Tämän tunnistautumisen avulla voimme tallentaa käyttäjänimen ja osan käyttäjätiedoista evästeisiin,
Perusidentiteetin ja roolien tunnistautuminen onnistuu helposti perusehtojen asetuksilla.
Tässä saavutettava vaikutus on toteuttaa roolipohjainen käyttöoikeuksien hallinta järjestelmän tarjoamalla Authorize-toiminnolla ilman jäsenyyttä.
1. Luo tiketti
Kun käyttäjä kirjautuu sisään, käyttäjän ID ja vastaava rooli (useille rooleille erillään) tallennetaan tikettiin.
Salaa tiketti FormsAuthentication.Encrypt -toiminnolla.
Tallenna salattu tiketti Response-evästeeseen (asiakas js ei tarvitse lukea tätä evästettä, joten on parasta asettaa HttpOnly=True estämään selainhyökkäykset varastamasta ja väärentämästä evästeitä). Näin voit lukea sen seuraavalla kerralla Request-evästeestä.
Yksinkertainen demo on seuraava:
bool isPersistent, //insist to persist (aseta tarpeen mukaan, jos se on asetettu persistenceksi, evästeen Expires-asetus on asetettava evästeen lähettämisen yhteydessä)
FormsAuthenticationTicketin kuudes parametri tallentaa userData-tyyppijonon, jossa nykyisen käyttäjän rooli-ID on tallennettu, erotettuna pilkulla.
Kun kirjaudutaan sisään käyttäjätunnuksella "test", asiakkaalle ilmestyy lokieväste
2. Hanki sertifiointitiedot
Sisäänkirjautumisen jälkeen sisältösivulla voimme saada uname-tiedot nykyisen pyynnön User.Identity.Name kautta, tai voimme purkaa evästeen pyynnöstä ja saada siitä uname- ja käyttäjätiedot (eli aiemmin tallennetut rooli-ID-tiedot).
3. Toteuta käyttöoikeuksien hallinta annotaatioattribuuttien avulla
Määritä Ota käyttöön lomakkeiden autentikointi ja roolien hallinta web.config-tiedostossa
Kun lisäämme merkintäominaisuudet Controlleriin ja Actioniin, mistä saamme Role-ominaisuuden? Koska emme käytä jäsenyyteen perustuvaa tunnistautumista, aiomme myös luoda oman RoleProviderin. Nimi on CustomRoleProvider, joka on peritty RoleProviderilta. Tässä on oman CustomRoleProvider.cs-tiedostosi luominen Helper-kansiossa MVCAppin alla.
RoleProviderissa on monia abstrakteja menetelmiä, ja otamme käyttöön GetRolesForUser-metodin vain käyttäjäroolien saamiseksi. Käyttäjäroolia voidaan tässä hakea tietokannasta saatun käyttäjätunnuksen tai istuntoon tallennetun tai evästeeseen tallennetun ID:n perusteella. Tässä olen jo tallentanut roolin tiketin käyttäjädataan, joten otetaan se tiketistä.
Tarvittaessa lisää annotaatioattribuutit validoituun ohjaimeen tai toimintoon, esimerkiksi tämä toiminto sallii pääsyn vain RoleID:llä 1, 2 tai 3, ja käyttäjän nykyinen RoleID on (7, 1, 8), mikä tarkoittaa, että käyttäjällä on oikeus käyttää sitä.
P.S. :1. Tiketti tallennetaan evästeen vanhenemisajankohtaan, ja jos selain on suljettu muistamaan nykyinen tiketti, parametrit voidaan asettaa, kun FormsAuthenticationTicket on otettu käyttöön.
2. Rolin hankinta voidaan lukea suoraan tietokannasta ilman, että sitä tallennetaan tiketin userDataan, ja userData voi tallentaa muuta tietoa.
3. Jos haluat joustavasti konfiguroida Controllerin ja Actionin sallittuja käyttörooleja, voit mukauttaa OnAuthorization-menetelmää AuthorizeAttribute-ohituksessa, jossa metodia käytetään
Lue nykyisellä sivulla sallittu rooli-ID ja tarkista se nykyisen käyttäjän RoleID:n mukaan. Näin toteutuu roolin joustava kokoonpano.
4. Tiketin tiedot tallennetaan lopulta evästeeseen, ja turvallisuus on edelleen omasta harkinnastasi, mielestäni on parempi tallentaa UserID ja RoleID istuntoon.
|