Forms autentisering tillater ikke roller godkjenning. Denne artikkelen forklarer hvordan du skal gjennomføre det.
Basic danner godkjenning
Forms basert autentisering i ASP.NET er ganske nyttig. I stedet for å skrive våre egne godkjenningsprosesser kan vi bare endre web.config under system.web som så ....
< godkjenning modus = "Skjemaer" /> < former name = "MyWebsiteCookieName" loginUrl = "/Login.aspx" beskyttelse = "Alle" timeout = "180" /> < /autentisering >
Autentiseringsmodus er satt til Forms.
En URL er gitt slik at ASP.NET vet hvor du skal omdirigere folk som trenger å logge inn.
A timeout er angitt i minutter. Dette er "tid siden sist request" ikke "tid siden login". Hvis en pålogging er angitt å være vedvarende (beskrevet senere) dette er ignorert.
Neste jeg ønsket å angi en mappe som tilgang . er begrenset til personer som har logget inn å gjøre dette jeg kom inn følgende kode i filen web.config (under < konfigurasjon >) ...
< plassering path = "medlemmer" > < system.web > < autorisasjon > < nekte brukere = /> »?"; < /autorisasjon > < /system.web> < /plassering >
Dette forteller ASP.NET at banen "/medlemmer" (ledelsen /er alltid underforstått) skal nekte tilgang til alle ukjente brukere. Når noen prøver å få tilgang til en side i /Medlemmer vil de i stedet bli omdirigert til login.aspx URL du anga i web.config.
Dette Login.aspx skjemaet skal spørre om hva legitimasjonen du vil (brukernavn /passord for eksempel) og validere dem. Når de har blitt validert trenger du bare å utføre følgende kode for å ha brukeren omdirigert tilbake til siden de opprinnelig prøvde å få tilgang ...
System.Web.Security.FormsAuthentication.RedirectFromLoginPage (brukerid, false);
brukerid er en unik identifikator for gjeldende bruker (brukernavn), og den andre boolsk parameter angir om dette bør være en vedvarende sikkerhet cookie, eller et midlertidig (med utløps siden siste side forespørsel), som nevnt tidligere.
Roller
Det var på dette tidspunktet at jeg innså at jeg trengte en spesiell /Admin mappe. Denne mappen skal kun være tilgjengelige av administratorer, og ikke vanlige brukere. For dette har jeg tydeligvis trengte roller i web.config (under < konfigurasjon >) som så ...
< plassering path = "Admin" > < system.web > < autorisasjon > < tillate roller = "Admin" /> < nekte brukere = "*" /> < /autorisasjon > < /system.web> < /plassering >
Merk: Rekkefølgen på tillate /nekte er viktig. Hvis du nekter * (alle brukere) før du lar Admin rolle, ingen vil ha tilgang til mappen.
Problemet her, er at du bare får roller når autentiseringsmodus = "Windows". For denne modusen hver bruker trenger en gyldig Windows-brukerkonto på serveren. Ikke en god løsning.
Heldigvis fant jeg en interessant artikkel på MSDN. Når du godkjenne bruker i Login.aspx form, bør du finne ut hvilke roller som brukeren tilhører ...
if (author.IsAdministrator) roller = new String [] {"Admin", "medlem"}; andre roller = new String [] {"medlem"};
//1 time skyve utløpstid Cache.Add (author.UniqueId, roller, null, DateTime.MaxValue, TimeSpan.FromHours (1), CacheItemPriority.BelowNormal, null);
Jeg har laget en streng rekke holde rollene som brukeren har. Disse blir deretter lagret i Program [] samling av ytelsesårsaker, ellers ville vi ha en DB tilgang hver gang ønsket vi å få tak i den aktuelle brukerens roller.
Nå, fordi Forms autentisering ikke har begrep om Roller disse rollene vil aldri gå inn i den aktuelle brukerens cookie. Så vi må finne ut hva disse rollene er hver gang en autentiserings utføres. Til dette trenger vi å gå inn i Global.asax fil ...
beskyttet void Application_AuthenticateRequest (Object avsenderen, EventArgs e) {if (HttpContext.Current.User! = Null) {if (HttpContext.Current.User.Identity .AuthenticationType = "Skjemaer") kaster nytt unntak ("Only danner autentisering er støttet, ikke" + HttpContext.Current.User.Identity.AuthenticationType);!
System.Security.Principal.IIdentity userid = HttpContext.Current.User .Identity;
//Har vi noen roller å hente? I så fall erstatte brukerobjektet if (Application [userId.Name] = null!) HttpContext.Current.User = new System.Security.Principal.GenericPrincipal (brukerid, (string []) Cache [userId.Name]); } //bruker! = null}
Denne rutinekontroller som gjeldende bruker! = null. Dette betyr at siden er i et beskyttet sted. Hvis dette er tilfelle så bruker vi brukerid som nøkkelen til Cache [] samling for å finne en liste over roller. Hvis disse rollene eksisterer da vi overføre gjeldende bruker med et objekt skaper vi oss selv, et objekt som har en liste over roller.
Konklusjon
FOR ASP NET utvikling, er svært nyttig i webapplikasjoner rollebasert sikkerhet. Med noen enkle linjer med kode er det mulig å gjennomføre rollebasert sikkerhet for brukere uten en gyldig Windows-pålogging. Anmeldelser