Autorizarea și protejarea resurselor web în ASP.NET

Oferirea fiecărui utilizator de site web a unui cont individual vă permite să identificați în mod unic utilizatorii site-ului dvs. web și să confirmați că aceștia sunt aceia despre care pretind că sunt. Cunoașterea identității unui utilizator permite site-ului să se schimbe pentru a reflecta nevoile și interesele fiecărui utilizator. Deoarece site-urile web conțin în mod obișnuit mai multe secțiuni concepute pentru utilizatorii din roluri diferite de la publicul larg la administratorii de nivel înalt, puteți utiliza această identificare și pentru a gestiona accesul la diferitele resurse de pe site-ul web pe care fiecare utilizator are nevoie.

Pe un intranet intern al companiei, pot exista pagini care conțin rapoarte și date sensibile, care ar trebui să fie văzute doar de departamente specifice sau de managerii de rang înalt și nu de fiecare angajat al companiei. În majoritatea cazurilor, numai anumiți administratori ar avea acces deplin la modificarea setării site-ului web, iar alți utilizatori ar putea beneficia de mai puține abilități de schimbare. În toate aceste cazuri, trebuie să restricționăm aceste opțiuni pentru majoritatea utilizatorilor, permițându-le în același timp altora. Autorizarea vă permite să vă asigurați că utilizatorul poate accesa tot ce are nevoie de pe un site Web și poate efectua sarcinile dorite, dar nu mai mult.

De exemplu, pe un site de comerț electronic, ați dori ca clienții să navigheze produse, să adauge produse într-un cărucior și să comande aceste produse. Odată comandate, aceștia ar trebui să poată urmări ordinea și, eventual, să modifice ordinea înainte de expediere. Cu toate acestea, ați putea, de asemenea, să doriți ca clienții noi să vorbească cu un agent de service pentru clienți înainte de a le permite să schimbe o comandă. În nici un caz nu doriți ca orice client să poată vedea, modifica sau anula comenzile altor clienți.

Ca dezvoltator web, un aspect important de securitate al unui site, acestea vin în a asigura că utilizatorii nu au acces la acțiunile pe care nu ar trebui să le efectueze. Consecințele de a nu o proteja pot fi grave. 

Să examinăm o privire de ansamblu asupra autorizației și cum să o implementăm în ASP.NET.

Ce este autorizarea?

Oferirea de conturi unice persoanelor fizice ne permite să identificăm cine accesează site-ul nostru web. Încrederea în site știe cine este autentificarea unei persoane și a fost discutată anterior.

Odată ce cunoaștem utilizatorul, putem adapta site-ul pentru acel utilizator și personaliza site-ul web pentru a reflecta informațiile pe care le cunoaștem despre utilizator. Acest lucru poate varia de la aspecte simple, cum ar fi un site web care afirmă "Hi Bill", când mă loghez. 

Cele mai multe site-uri de comerț pot salva cartea mea de credit, adresa și alte informații de care trebuie să fac o comandă. Aceasta înseamnă că nu trebuie să introduc aceleași informații de fiecare dată, ceea ce face mai ușor pentru mine să plasez și să comand și, prin urmare, este mai probabil să comand de la ei. Site-urile Web pot lua acest lucru și mai mult, folosind istoricul și obiceiurile mele, pentru a sugera produse similare pe care aș putea fi interesate sau articole similare pe care aș putea să le citesc. S-ar putea, de asemenea, să pot seta preferințe în culori, categorii preferate sau alte setări pe care site-ul le poate utiliza.

Acest lucru poate oferi beneficii utile utilizatorilor site-ului, dar autorizarea se concentrează pe utilizarea identității unice a utilizatorului pentru a determina ce acțiuni poate efectua utilizatorul. Permite site-ului web să determine dacă un utilizator ar trebui să aibă capacitatea de a accesa diferite secțiuni ale unui site web, să poată accesa date sau să poată modifica datele. 

Această utilizare a identității va fi punctul central al acestui articol pe măsură ce analizăm metodele de protejare a porțiunilor site-ului dvs. web, concentrându-se pe ASP.NET.

Controlul accesului prin utilizarea grupurilor și a rolurilor

Deși este posibil să se ofere drepturi și responsabilități unice pentru fiecare utilizator unui site web, acest lucru devine rapid imposibil de gestionat pe măsură ce crește numărul de utilizatori. Rapid, șansa de greșeli crește cu fiecare nou utilizator care are nevoie de configurare personalizată. Dacă orice modificare a site-ului necesită drepturi sau setări noi, fiecare cont de utilizator ar trebui actualizat, eventual, necesitând actualizări manuale pentru sute sau mii de conturi.

Din acest motiv. utilizatorii sunt în mod normal grupați împreună cu cei care au drepturi sau nevoi similare. Grupurile sunt adesea denumite roluri, deoarece rolul utilizatorului într-un site deseori definește grupurile utilizate. Pentru fiecare grup, administratorul site-ului poate defini accesul și restricțiile în cadrul aplicației web. 

Apoi le atribuiți utilizatorilor aceste grupuri și utilizatorul va prelua drepturile și restricțiile atribuite acelui grup. Drepturile pot fi luate pur și simplu prin eliminarea utilizatorului din grup. Majoritatea sistemelor suportă un utilizator care se află în mai multe grupuri în același timp în care un utilizator poate avea mai multe roluri.

Utilizatorii în mai multe roluri necesită o metodă de abordare a cazurilor în care conflictul dintre setările a două grupuri este în conflict. De exemplu, luați un utilizator care este membru al a două grupuri. Un grup permite utilizatorului să creeze o nouă postare de blog, iar al doilea neagă această abilitate utilizatorului. Site-ul Web trebuie să rezolve acest conflict într-un mod coerent și previzibil. În aproape toate cazurile, cele mai bune practici nu permit drepturi în mod implicit, adaugă doar drepturi enumerate în mod specific și să permită respingerea altor setări. În acest caz, grupul care neagă dreptul ar ignora grupul care a refuzat accesul.

O modificare a divizării utilizatorilor în grupuri bazate pe roluri ar fi crearea de grupuri bazate pe activitate. În primul caz, este posibil să aveți "autori", "editori", "editori" etc. În al doilea rând, puteți avea grupuri pentru "creați articolul", "editați articol", "ștergeți articol", "publicați articolul". Această metodă oferă mai multă flexibilitate în schimbul gestionării mai multor grupuri.

Protejarea paginilor în site-urile web ASP.NET

Prima dvs. preocupare ar trebui să fie protejarea paginilor web de pe site-ul dvs. Mă concentrez pe ASP.NET pentru specificul din acest articol, dar majoritatea cadrelor web folosesc concepte similare, deși nu aceleași fișiere și comenzi. În funcție de sistem, există trei abordări pentru securizarea și site-ul web ASP.NET: 

  1. Rutare ASP.NET
  2. Formulare web ASP.NET
  3. ASP.NET MVC

Protecția formularului Web ASP.NET Site-uri

Rutarea ASP.NET și formularele web ASP.NET utilizează web.config fișier pentru a asigura accesul la paginile web. O configurație de bază pentru securizarea unei resurse pe un site web ar arăta similară cu următoarea:

         

Elementul de localizare al acestui fragment XML definește calea spre fișierul, dosarul sau ruta cu care avem de-a face. Aici specificăm că acest lucru este valabil pentru adminhome.aspx pagina specificată. Acest lucru ar putea da și un dosar pe site și s-ar aplica acelui dosar. Dacă nu specificați niciun atribut de cale, setările de configurare se aplică directorului curent al acestuia web.config dosarul și toate directoarele pentru copii.

autorizare elementul conține setările utilizate pentru a configura persoanele care au acces și cărora li se refuză accesul la obiectul specificat în cale element. Regulile sunt verificate începând cu prima regulă în ordine până când se găsește un meci. permite element specifică rolurile și / sau utilizatorii cărora li se va acorda acces la resursă. În mod similar nega element specifică utilizatorii și rolurile care nu vor avea acces la resursă.

În acest exemplu, regulă va fi verificată mai întâi. În cazul în care utilizatorul se află în rolul de admin, li se acordă acces și nu mai trebuie verificat nimic. Dacă utilizatorul nu este în acel rol, atunci ASP.NET continuă să ruleze. Aici, asta regula ar refuza toți utilizatorii. Acest exemplu ar permite astfel accesul utilizatorilor în rolul de administrator. Toți ceilalți utilizatori ar fi refuzat accesul.

Există câteva caractere speciale pentru a specifica grupuri comune. Am văzut * utilizatorul de mai sus, care specifică toți utilizatorii. ? utilizatorul se referă la utilizatorii anonimi, adică la orice utilizator care nu sa conectat în prezent. Utilizatorii și rolurile multiple pot fi specificate separându-le cu o virgulă. Utilizatorii și rolurile pot fi amestecate în aceeași regulă, cum ar fi:

Protejarea site-urilor ASV.NET MVC

ASP.NET MVC se concentrează asupra controlorilor și acțiunilor pe acele controlere în loc de fișiere. Aceasta schimbă metoda de securizare a accesului la un site ASV.NET MVC. În mod implicit, toate acțiunile și controlorii pot fi accesate de toți utilizatorii, la fel ca în WebForms. Încă mai folosiți aceleași atribute de rol și de utilizator, dar nu le mai setați în cadrul web.config fişier. 

În schimb, aplicați un [Autoriza] atribuiți direct controlorilor și acțiunilor dvs. Ca exemplu, dacă aveți un AdminController care ar trebui să fie accesate numai de membrii rolului de administrator, puteți face acest lucru adăugând utilizatorii și / sau rolurile în etichetă. Rețineți că acest lucru acționează ca o permisiune cu o refuzare implicită pentru tot ce nu este permis în mod specific.

[Autorizați (roluri = "siteadmin")] clasă publică AdminController: Controller ... 

La fel * și ? opțiunile pentru toți utilizatorii și utilizatorii anonimi sunt, de asemenea, disponibile pentru acest atribut. Puteți aplica regulile în mod specific unei acțiuni individuale asupra operatorului pentru a restricționa numai acele acțiuni. Atributele specificate pentru o acțiune vor înlocui cele specificate pentru întregul controler.

[Autorizați (roluri = "siteadmin")] public ActionResult AdminView () ... 

Dacă nu specificați roluri sau utilizatori cu [Autoriza] atribut, atunci acesta va permite oricărui utilizator autentificat să se conecteze. Aceasta vă permite să permiteți accesul la acțiuni sau controlere doar pentru utilizatorii care sunt conectați în mod specific la sistem. 

ASP.NET 4 a adăugat un [AllowAnonymous] atribut care vă permite să înlocuiți acest lucru pentru o acțiune în cadrul unui controler. Îl puteți găsi utilizat în orice nou proiect implicit ASP.NET MVC Internet pentru a gestiona accesul la AccountController controlor.

Gestionarea paginilor utilizate de mai multe roluri

Odată ce ați protejat accesul la dosarele, fișierele, acțiunile și rutele de pe site-ul dvs., trebuie să urmăriți asigurarea accesului adecvat în cadrul codului serverului în sine. Unele pagini sunt ușor de protejat prin faptul că numai un singur rol ar trebui să le acceseze sau să le vadă deloc și acești utilizatori au capacitatea de a face ceva pe pagina.

Pentru multe pagini, rolurile diferite pot accesa aceeași pagină, dar au drepturi și abilități diferite o dată pe pagină. În aceste cazuri, aveți grijă să nu afișați legături către acțiuni, adrese URL sau fișiere pe care utilizatorul curent nu le are dreptul de acces. 

Nu există nicio valoare în afișarea linkului către zona de administrare unui utilizator fără acces la admin sau a unui buton "Comandă de rambursare" către un utilizator care nu are această abilitate. Chiar dacă butonul sau link-ul este inactiv, acesta oferă informații potențiale unui atacator. De asemenea, poate provoca confuzii pentru utilizatorii legitimi ai site-ului. Dacă linkul este activ, dar apoi solicită o autentificare, ați oferit unui atacator o pagină de vizat și, din nou, este posibil să confundați un utilizator legitim al site-ului.

Codul serverului din spatele unei pagini accesate de utilizatori în roluri multiple trebuie să valideze întotdeauna drepturile utilizatorului înainte de a efectua o acțiune. Dacă atât administratorii, cât și utilizatorii anonimi pot accesa o pagină, trebuie să confirmați că utilizatorul se află într-un rol de administrator înainte de a efectua acțiuni care pot face numai rolul de administrator. Utilizatorul ar putea încerca o acțiune pe care nu ar trebui să o poată efectua prin clic pe un link care nu ar fi trebuit să fie afișat, experimentarea sau o încercare deliberată de hacking. 

Din nou, asumați întotdeauna cel mai puțin privilegiu și solicitați acordarea explicită prin apartenența la grup, roluri sau alte elemente înainte de a efectua funcții securizate.

De asemenea, aveți grijă dacă acțiunea este trecută ca parametru pentru o pagină. Luați o adresă URL care completează o comandă sub forma de UpdateOrder.aspx? Ordine = 33 & action = șterge. Imaginați-vă că un hacker a încercat să acceseze alte acțiuni la întâmplare până când a descoperit UpdateOrder.aspx? Ordine = 33 & action = rambursare ar credita taxa pentru comanda inapoi fara a anula comanda. Nu vă bazați niciodată pe o legătură ascunsă sau nereprezentată ca singurul mecanism de apărare împotriva acțiunilor neautorizate.

Aspecte de securitate ale sesiunilor utilizatorilor

În timp ce aspectul de autentificare diferă de elementul de autorizare discutat aici, ele sunt interdependente. În primul rând, la sesiunea de conectare, sunt de obicei setate cu un timeout în configurație. În ASP.NET, acesta este setat în fișierul web.config din secțiune.

Aceasta ar seta timpul de expirare pentru un utilizator la 30 de minute. slidingExpiration atributul determină dacă o solicitare resetează acest numărător înapoi la zero. Cu setul fals, atunci un utilizator ar trebui să se întoarcă în fiecare treizeci de minute, chiar dacă utilizează în mod activ site-ul pe întreaga durată.

De asemenea, aveți grijă de riscul deturnării sesiunii. Majoritatea cadrelor web utilizează un identificator unic pentru utilizatorul autentificat, în mod normal stocat într-un modul cookie. Dacă acest modul cookie nu este protejat într-un fel, atunci oricine poate vedea traficul utilizatorului poate folosi acel cookie pentru a se dezactiva ca utilizator original. 

Extensia FireSheep Firefox a demonstrat acest lucru și a oferit o metodă simplă pentru a efectua această interceptare și împodobire. Puteți preveni acest lucru numai prin criptarea SSL a întregii sesiuni de browser web sau cel puțin protejând cookie-ul care conține datele cu criptare SSL.

Puteți proteja împotriva acestui lucru folosind cookie-urile SSL numai pentru jetonul de autentificare reprezentând utilizatorul conectat. Aceasta asigură că cookie-ul este trimis numai când pagina este accesată de SSL. 

În ASP.NET, puteți aplica acest lucru prin setarea requireSSL = "true" atribut pe porțiune din web.config când se utilizează autentificarea formularelor. Pentru o protecție mai bună, puteți seta și element în web.config pentru a seta toate cookie-urile pe SSL numai în mod implicit.

Concluzie

Utilizarea site-urilor web de către mulți utilizatori cu nevoi și responsabilități diferite necesită metode pentru a preveni accesul neautorizat la date și funcționalități sensibile. Puteți utiliza identitatea unică a unui utilizator pentru a determina ce drepturi are utilizatorul și pentru a aplica aceste drepturi în cadrul aplicației dvs. web.

Începeți prin a vă asigura că paginile și acțiunile din cadrul aplicației dvs. web sunt restricționate numai la acei utilizatori care ar trebui să aibă capacitatea de a colabora cu aceștia. 

Pentru paginile accesate de utilizatori în mai multe roluri, trebuie să aveți grijă să validați că utilizatorul are dreptul de a efectua acțiunile solicitate înainte de a le efectua. Dat fiind faptul că identitatea utilizatorului definește accesul acestora, trebuie să aveți grijă să vă asigurați că alții nu pot impersona un utilizator cu mai multe drepturi. 

Combinarea acestor pași va duce mult la protejarea aplicației dvs. web.

Cod