Kontext.Benutzer verlieren Rollen nach vergeben werden, die in Globale.asax.Application_AuthenticateRequest

StackOverflow https://stackoverflow.com/questions/56271

Frage

Ich verwende die Formularauthentifizierung in meinem asp.net (3.5) Anwendung.Ich bin auch mit Rollen zu definieren, welche Benutzer Zugriff auf die Unterverzeichnisse der app.So werden die entsprechenden Teile in meinem web.config-Datei wie folgt Aussehen:

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies"  />      
  </authentication>
  <authorization >
    <allow users="*"/>
  </authorization>
</system.web>

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

Basierend auf dem, was ich gelesen habe, sollte dies sicherstellen, dass nur Benutzer Zugriff auf die Admin-Verzeichnis-Benutzer, die Authentifiziert wurden und die Admin-Rolle zugewiesen.

Die Authentifizierung von Benutzern, das speichern der Authentifizierungs-ticket, und andere damit zusammenhängende Fragen alle gut funktionieren.Wenn ich entfernen Sie die tags aus dem Internet.config-Datei funktioniert alles einwandfrei.Das problem kommt, wenn ich das versuchen zu erzwingen, dass nur Benutzer mit Admin-Rolle sollten in der Lage sein, um Zugriff auf das Admin-Verzeichnis.

Basierend auf dieser MS KB-Artikel zusammen mit anderen Internetseiten geben die gleichen Informationen habe ich folgenden code Hinzugefügt, um meine Global.asax-Datei:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

Allerdings, wenn ich versuchen zu log in, ich bin nicht in der Lage, um den Zugriff auf die Ordner "Admin" (umgeleitet zur login-Seite).

Versucht zu Debuggen, das Problem, wenn ich Schritt durch eine Anfrage, ob ich ausführen Kontext.Benutzer.IsInRole("Admin") in der Zeile Debug#1 oben, es false zurück.Wenn ich führen Sie die gleiche Anweisung in Zeile Debug#2, es ist gleich wahr.Also zumindest so weit wie Global.asax betroffen ist, ist die Rolle ist richtig zugewiesen.

Nach Global.asax, springt die Ausführung direkt auf der Login-Seite (da der Mangel der Rolle der Ursachen, die das laden der Seite im admin-Ordner werden abgelehnt).Allerdings, wenn ich führen Sie die gleiche Anweisung in der ersten Zeile der Page_Load-von der Anmeldung, es gibt false zurück.Also irgendwo nach Application_AuthenticateRequest in Global.asax und das erste laden des WebForm in das beschränkte Verzeichnis, die Rolle von Informationen verloren geht, wodurch die Authentifizierung fehl (Hinweis:in Page_Load, die richtige Authentifizierungs-ticket ist noch zugeordnet Kontext.Benutzer.Id - nur die Rolle wird verloren).

Was mache ich falsch und wie kann ich es bekommen, um richtig zu arbeiten?


Update:Ich betrat die Lösung unten

War es hilfreich?

Lösung

Hier war das Problem und Lösung :

Früher Entwicklung hatte ich auf die Website Menü gegangen und klickte auf Asp.net-Konfiguration. Daraus ergab sich die folgende Zeile in die web.config hinzugefügt werden:

<system.web>
  <roleManager enabled="true" />
</system.web>

Von diesem Punkt an, die App wurde unter der Annahme, dass ich Rollen durch die Asp.net Site-Manager zu tun, und nicht durch FormsAuthentication Rollen. So sind die wiederholten Ausfälle, trotz der Tatsache, dass die eigentliche Authentifizierung und Rollen Logik wurde korrekt eingerichtet ist.

Nachdem diese Zeile entfernt wurde alles von web.config funktionierte perfekt.

Andere Tipps

Das ist nur ein zufälliger Schuss, aber sind Ihnen wegen der Reihenfolge der Genehmigung für Admin gesperrt zu werden? Vielleicht sollten Sie versuchen, Sie alle und alle Ihre Admin verweigern wechseln.

Für den Fall, wird es durch die leugnen, überschrieben zu werden.

(ich hatte Codebeispiele in hier, aber sie waren nicht angezeigt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top