2009-03-06 11 views
0

Ich mache eine benutzerdefinierte Authentifizierungsmethode, die ein Light-Session-Objekt verwendet, um die Autorisierungsdetails eines Benutzers zu speichern. Jetzt möchte ich, dass jede Seite (hauptsächlich Unterseiten von Mastern) erkennen kann, ob ein Benutzer Zugriff auf die Seite haben soll.Benutzerdefinierte Autorisierung in ASP.NET mit untergeordneten Seiten

Soll ich eine Seitenklasse erstellen und daraus die untergeordneten Seiten ableiten?

Was ist der beste Weg für die Anwendung zu wissen, welche Rollen Zugriff auf welche Seite haben?

Antwort

0

Wenn Sie viel Flexibilität bei der Autorisierung benötigen, sollten Sie eine benutzerdefinierte Seitenklasse verwenden. Ansonsten sollte Web.config genug sein.

0

Wenn Sie es mit einem benutzerdefinierten Rollenanbieter verbinden, können Sie sich tatsächlich auf die asp.net-Konfiguration verlassen. Es gibt eine Methode, die Sie, ob der Benutzer überprüfen können ist berechtigt, eine bestimmte Seite zuzugreifen:

System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(
    "~/admin/test.aspx", principal, "GET" 
); 

Sie dann normale Annäherung an web.config verwenden zu genehmigungs zu konfigurieren. Wenn sich die Seiten in demselben Ordner befinden, können Sie einfach eine web.config-Datei zu diesem Ordner hinzufügen und die Autorisierung entsprechend konfigurieren.

0

In gleichen Szenarien habe ich die Seiten, die Authentifizierung in einem Ordner benötigen und ich definiere Lage Element in web.config-Authentifizierung so zu konfigurieren:

<location path="protected"> 
    <system.web> 
     <authorization> 
      <deny users="?"/> 
     </authorization> 
    </system.web> 
</location> 
1

Ich mag nicht über die Basisseite Ansatz. Für mich ist es zu spät, um die Sicherheit zu überprüfen. Sie können Ihr eigenes HttpModule erstellen, um dies zu überprüfen, indem Sie entweder die Autorisierungsinformationen in einer Datenbank/xml/... speichern oder sie durch Reflektion auf der Seite lesen.

Der context.Handler enthält die von Ihnen ausgeführte Klassenseite. So können Sie etwas tun:

kopiere ich ein Teil des Codes ich verwende, überprüft es Rollen, öffentliche Seiten, überspringt die Prüfung für Bilder und Skripte (aber man könnte es auch tun):

// In the HttpModule: 
    public void context_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     HttpContext context = HttpContext.Current; 

     // Don´t validate permissions if the user wasn´t allowed by the asp.net security 
     // Neighter the advanced (custom) permissions are validated for non ASPX files. 
     if (!context.Request.FilePath.EndsWith(".aspx") || !context.User.Identity.IsAuthenticated) 
      return; 

     // Give full access to the unathorized error page, and logins, and so on... 
     string pageClass = context.Handler.GetType().BaseType.FullName; 

     string param = context.Request["p"]; 
     if (!string.IsNullOrEmpty(param)) 
      pageClass += "@" + param; 

     if (SecurityService.IsFullTrustClass(pageClass)) 
      return; 

     if (SecurityService.Context.CurrentPerson == null) 
     { 
      LogOff(); 
      return; 
     } 

     // Verify access permissions for the current page 
     IList<Role> roles = SecurityService.Context.CurrentPerson.Roles; 
     bool allow = SecurityService.HasAccessPermission(pageClass, roles); 

     if (!allow) 
     { 
      LogOff(); 
     } 
    } 
Verwandte Themen