ASP-Formularauthentifizierung mit Rollen


Formular-Authentifizierung erlaubt keine Rollen-Authentifizierung. Dieser Artikel beschreibt wie sie realisiert.

Grundformen-Authentifizierung

Formularbasierte Authentifizierung in ASP ist ziemlich nützlich. Statt zu schreiben unsere eigenen Authentifizierungsprozesse ändern wir einfach die Datei web.config unter system.web etwa so...

< Authentifizierungsmodus = 'Formulare' / >
< Formen
Name = 'MyWebsiteCookieName'
loginUrl='/Login.aspx'
Schutz = 'All'
Timeout = '180'
/ >
< / Authentifizierung >

  • Der Authentifizierungsmodus ist Formen festgelegt.
  • Eine URL wird bereitgestellt, so dass ASP weiß, wo man Leute umleiten, die müssen sich einloggen.
  • Ein Timeout wird in Minuten angegeben. Dies ist 'Zeit seit der letzten Anforderung' nicht die 'Zeit seit Anmeldung'. Eine Anmeldung ist persistent angegeben ist (wird später beschrieben) dies ignoriert.
  • Für das Cookie ist eine Methode zum Schutz angegeben.

Als nächstes wollte ich einen Ordner angeben, den Zugriff auf Personen beschränkt ist, die sich angemeldet haben. Dazu habe ich den folgenden Code in der Datei web.config (unter < Konfiguration >)...

< Location-Path = 'Mitglieder' >
< system.web >
< Autorisierung >
< verweigern Benutzer = '?' / >
< / Autorisierung >
< /system.web >
< / Lage >

Dies sagt ASP, die den Pfad '/ Mitglieder' (Führung / wird immer impliziert) sollten alle unbekannten Benutzern den Zugang verweigern. Wenn jemand versucht, eine Seite im /Members zugreifen, werden sie stattdessen auf die login.aspx URL umgeleitet, die Sie in der Datei web.config angegeben.

Dieses Formular Login.aspx sollten Fragen, welche Anmeldeinformationen Sie möchten (z. B. Benutzername/Passwort) und bestätigen sie. Nachdem sie bestätigt haben müssen Sie nur führen Sie den folgenden Code, um den Benutzer zurück zur Seite, die sie ursprünglich versuchten Zugriff auf weitergeleitet zu haben...

System.Web.Security.FormsAuthentication.RedirectFromLoginPage (UserId, false);

Die Benutzer-ID ist die eindeutige Kennung für den aktuellen Benutzer (Benutzername) und der zweiten boolesche Parameter angibt, ob diese sollte eine dauerhafte Sicherheitscookie oder eine temporäre ein (mit Ablauf seit der letzten Seitenanforderung), als bereits erwähnt.

Rollen

Es war an diesem Punkt, dass mir klar, ich brauchte einen speziellen/admin-Ordner. Dieser Ordner sollte nur von Administratoren und nicht normal Benutzer zugegriffen werden. Für diese ich brauchte offensichtlich Rollen in der Datei web.config (unter < Konfiguration >) also wie...

< Location-Path = 'Admin' >
< system.web >
< Autorisierung >
< können mithilfe von Rollen = 'Admin' / >
< verweigern Benutzer = '*' / >
< / Autorisierung >
< /system.web >
< / Lage >

Hinweis: ist die Reihenfolge der der Allow/deny wichtig. Wenn Sie verweigern * (alle Benutzer) bevor Sie die Admin-Rolle zu ermöglichen, wird niemand haben Zugriff auf den Ordner.

Das Problem dabei ist aber, dass Sie nur Rollen bekommen wenn der Authentifizierungsmodus = 'Windows'. Für diesen Modus benötigt jeder Benutzer ein gültiges Windows-Benutzerkonto auf dem Server. Keine gute Lösung.

Zum Glück fand ich einen interessanten Artikel auf MSDN. Wenn Sie Ihre Benutzer in die Login.aspx-Formular anmelden, sollten Sie dann heraus, welche Rollen arbeiten, die, denen der Benutzer angehört...

Wenn (Autor. IsAdministrator)
Rollen = String [] {'Admin', 'Mitglied'};
sonst
Rollen = new String [] {'Member'};

1 Stunde gleitende Ablaufzeit
Cache.Add (Autor. UniqueId, Rollen, Null, DateTime.MaxValue,
TimeSpan.FromHours(1), CacheItemPriority.BelowNormal, Null);

Ich habe ein String-Array halten die Rollen, die der Benutzer besitzt. Diese werden dann in der Anwendung [] Auflistung aus Performance-Gründen gespeichert, die wir einen DB-Zugriff zu haben hätten, jedes Mal, wenn wir wollten Rollen des aktuellen Benutzers abzurufen.

Jetzt, da Formularauthentifizierung kein Konzept für Rollen hat werden diese Rollen nie des aktuellen Benutzers Cookies gehen. So müssen wir feststellen, was diese Rollen sind, jedes Mal, wenn eine Authentifizierung ausgeführt wird. Dafür brauchen wir in der Datei global.asax zu gehen...

privatevoid Application_AuthenticateRequest (geschützt
Object Sender, EventArgse)
{
Wenn (HttpContext.Current.User! = Null)
{
Wenn (HttpContext.Current.User.Identity.AuthenticationType! = 'Formulare')
neue Ausnahme auslösen ('nur Formularauthentifizierung verwendet wird, wird nicht unterstützt' +
HttpContext.Current.User.Identity.AuthenticationType);

System.Security.Principal.IIdentity UserId =
HttpContext.Current.User.Identity;

Haben wir einige Rollen abrufen? Wenn dies der Fall ist, ersetzen Sie das Benutzerobjekt
Wenn (Application[userId.Name]! = Null)
HttpContext.Current.User = neue System.Security.Principal.GenericPrincipal ()
Benutzer-ID (String [] Cache[userId.Name]
);
} //user! = Null
}

Diese Routine überprüft, dass der aktuelle Benutzer! = Null. Dies bedeutet, dass die Seite in einem geschützten Bereich. Wenn dies der Fall ist dann verwenden wir die UserId als Schlüssel der Cache [] Auflistung finden Sie eine Liste der Rollen. Wenn diese Rollen vorhanden, dann wir den aktuellen Benutzer mit einem Objekt zuweisen, schaffen wir uns selbst, ein Objekt, das eine Liste von Rollen hält.

Fazit

FÜR ASP-NET-Entwicklung ist die rollenbasierte Sicherheit in Web-Anwendungen sehr nützlich. Mit ein paar einfachen Codezeilen ist es möglich, rollenbasierte Sicherheit für Benutzer ohne eine gültige Windows-Anmeldung zu implementieren.









ASP-Formularauthentifizierung mit Rollen


ASP-Formularauthentifizierung mit Rollen : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Formular-Authentifizierung erlaubt keine Rollen-Authentifizierung. Dieser Artikel beschreibt wie sie realisiert.

Grundformen-Authentifizierung

Formularbasierte Authentifizierung in ASP ist ziemlich nützlich. Statt zu schreiben unsere eigenen Authentifizierungsprozesse ändern wir einfach die Datei web.config unter system.web etwa so...

< Authentifizierungsmodus = 'Formulare' / >
< Formen
Name = 'MyWebsiteCookieName'
loginUrl='/Login.aspx'
Schutz = 'All'
Timeout = '180'
/ >
< / Authentifizierung >

  • Der Authentifizierungsmodus ist Formen festgelegt.
  • Eine URL wird bereitgestellt, so dass ASP weiß, wo man Leute umleiten, die müssen sich einloggen.
  • Ein Timeout wird in Minuten angegeben. Dies ist 'Zeit seit der letzten Anforderung' nicht die 'Zeit seit Anmeldung'. Eine Anmeldung ist persistent angegeben ist (wird später beschrieben) dies ignoriert.
  • Für das Cookie ist eine Methode zum Schutz angegeben.

Als nächstes wollte ich einen Ordner angeben, den Zugriff auf Personen beschränkt ist, die sich angemeldet haben. Dazu habe ich den folgenden Code in der Datei web.config (unter < Konfiguration >)...

< Location-Path = 'Mitglieder' >
< system.web >
< Autorisierung >
< verweigern Benutzer = '?' / >
< / Autorisierung >
< /system.web >
< / Lage >

Dies sagt ASP, die den Pfad '/ Mitglieder' (Führung / wird immer impliziert) sollten alle unbekannten Benutzern den Zugang verweigern. Wenn jemand versucht, eine Seite im /Members zugreifen, werden sie stattdessen auf die login.aspx URL umgeleitet, die Sie in der Datei web.config angegeben.

Dieses Formular Login.aspx sollten Fragen, welche Anmeldeinformationen Sie möchten (z. B. Benutzername/Passwort) und bestätigen sie. Nachdem sie bestätigt haben müssen Sie nur führen Sie den folgenden Code, um den Benutzer zurück zur Seite, die sie ursprünglich versuchten Zugriff auf weitergeleitet zu haben...

System.Web.Security.FormsAuthentication.RedirectFromLoginPage (UserId, false);

Die Benutzer-ID ist die eindeutige Kennung für den aktuellen Benutzer (Benutzername) und der zweiten boolesche Parameter angibt, ob diese sollte eine dauerhafte Sicherheitscookie oder eine temporäre ein (mit Ablauf seit der letzten Seitenanforderung), als bereits erwähnt.

Rollen

Es war an diesem Punkt, dass mir klar, ich brauchte einen speziellen/admin-Ordner. Dieser Ordner sollte nur von Administratoren und nicht normal Benutzer zugegriffen werden. Für diese ich brauchte offensichtlich Rollen in der Datei web.config (unter < Konfiguration >) also wie...

< Location-Path = 'Admin' >
< system.web >
< Autorisierung >
< können mithilfe von Rollen = 'Admin' / >
< verweigern Benutzer = '*' / >
< / Autorisierung >
< /system.web >
< / Lage >

Hinweis: ist die Reihenfolge der der Allow/deny wichtig. Wenn Sie verweigern * (alle Benutzer) bevor Sie die Admin-Rolle zu ermöglichen, wird niemand haben Zugriff auf den Ordner.

Das Problem dabei ist aber, dass Sie nur Rollen bekommen wenn der Authentifizierungsmodus = 'Windows'. Für diesen Modus benötigt jeder Benutzer ein gültiges Windows-Benutzerkonto auf dem Server. Keine gute Lösung.

Zum Glück fand ich einen interessanten Artikel auf MSDN. Wenn Sie Ihre Benutzer in die Login.aspx-Formular anmelden, sollten Sie dann heraus, welche Rollen arbeiten, die, denen der Benutzer angehört...

Wenn (Autor. IsAdministrator)
Rollen = String [] {'Admin', 'Mitglied'};
sonst
Rollen = new String [] {'Member'};

1 Stunde gleitende Ablaufzeit
Cache.Add (Autor. UniqueId, Rollen, Null, DateTime.MaxValue,
TimeSpan.FromHours(1), CacheItemPriority.BelowNormal, Null);

Ich habe ein String-Array halten die Rollen, die der Benutzer besitzt. Diese werden dann in der Anwendung [] Auflistung aus Performance-Gründen gespeichert, die wir einen DB-Zugriff zu haben hätten, jedes Mal, wenn wir wollten Rollen des aktuellen Benutzers abzurufen.

Jetzt, da Formularauthentifizierung kein Konzept für Rollen hat werden diese Rollen nie des aktuellen Benutzers Cookies gehen. So müssen wir feststellen, was diese Rollen sind, jedes Mal, wenn eine Authentifizierung ausgeführt wird. Dafür brauchen wir in der Datei global.asax zu gehen...

privatevoid Application_AuthenticateRequest (geschützt
Object Sender, EventArgse)
{
Wenn (HttpContext.Current.User! = Null)
{
Wenn (HttpContext.Current.User.Identity.AuthenticationType! = 'Formulare')
neue Ausnahme auslösen ('nur Formularauthentifizierung verwendet wird, wird nicht unterstützt' +
HttpContext.Current.User.Identity.AuthenticationType);

System.Security.Principal.IIdentity UserId =
HttpContext.Current.User.Identity;

Haben wir einige Rollen abrufen? Wenn dies der Fall ist, ersetzen Sie das Benutzerobjekt
Wenn (Application[userId.Name]! = Null)
HttpContext.Current.User = neue System.Security.Principal.GenericPrincipal ()
Benutzer-ID (String [] Cache[userId.Name]
);
} //user! = Null
}

Diese Routine überprüft, dass der aktuelle Benutzer! = Null. Dies bedeutet, dass die Seite in einem geschützten Bereich. Wenn dies der Fall ist dann verwenden wir die UserId als Schlüssel der Cache [] Auflistung finden Sie eine Liste der Rollen. Wenn diese Rollen vorhanden, dann wir den aktuellen Benutzer mit einem Objekt zuweisen, schaffen wir uns selbst, ein Objekt, das eine Liste von Rollen hält.

Fazit

FÜR ASP-NET-Entwicklung ist die rollenbasierte Sicherheit in Web-Anwendungen sehr nützlich. Mit ein paar einfachen Codezeilen ist es möglich, rollenbasierte Sicherheit für Benutzer ohne eine gültige Windows-Anmeldung zu implementieren.


ASP-Formularauthentifizierung mit Rollen

ASP-Formularauthentifizierung mit Rollen : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Freunden empfehlen
  • gplus
  • pinterest

Kürzliche Posts

Kommentar

Einen Kommentar hinterlassen

Wertung