2008-09-11 12 views
3

Ich verwende Forms-Authentifizierung in meiner asp.net (3.5) -Anwendung. Ich verwende auch Rollen, um zu definieren, welcher Benutzer auf welche Unterverzeichnisse der App zugreifen kann. So sehen die entsprechenden Abschnitte meiner web.config-Datei wie folgt:Context.User verlieren Rollen nach dem Zuweisen in Global.asax.Application_AuthenticateRequest

<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> 

Nach dem, was ich gelesen habe, dies, dass die einzigen Benutzer in der Lage sicherzustellen, sollte das Admin-Verzeichnis zugreifen Benutzer, die authentifiziert wurden und die Admin-Rolle zugewiesen.

Benutzerauthentifizierung, Speichern des Authentifizierungstickets und andere damit verbundene Probleme funktionieren einwandfrei. Wenn ich die Tags aus der Datei web.config lösche, funktioniert alles einwandfrei. Das Problem tritt auf, wenn ich versuche durchzusetzen, dass nur Benutzer mit der Rolle "Admin" auf das Verzeichnis "Admin" zugreifen dürfen.

Auf dieser Basis MS KB article zusammen mit anderen Web-Seiten die gleichen Informationen zu geben, habe ich den folgenden Code in meine Global.asax-Datei hinzugefügt:

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 
     } 
    } 
} 

aber wenn ich versuche, um sich einzuloggen, ich bin nicht in der Lage zu Greife auf den Admin-Ordner zu (umgeleitet zur Login-Seite).

Versuchen, das Problem zu debuggen, wenn ich eine Anfrage durchlaufen, wenn ich Context.User.IsInRole ("Admin") an der Zeile Debug oben # 1 ausgeführt, gibt es eine falsche zurück. Wenn ich dieselbe Anweisung in Zeile Debug # 2 ausführe, ist es wahr. Zumindest was Global.asax betrifft, wird die Rolle korrekt zugewiesen.

Nach Global.asax springt die Ausführung direkt auf die Anmeldeseite (da das Fehlen der Rolle dazu führt, dass die Seite im Admin-Ordner nicht geladen wird). Wenn ich dieselbe Anweisung jedoch in der ersten Zeile von Page_Load der Anmeldung ausführen, wird false zurückgegeben. Nach Application_AuthenticateRequest in Global.asax und dem initialen Laden des WebForms im eingeschränkten Verzeichnis gehen die Rolleninformationen daher verloren, wodurch die Authentifizierung fehlschlägt (Hinweis: In Page_Load ist das richtige Authentifizierungsticket weiterhin Context.User.Id zugeordnet - nur die Rolle geht verloren).

Was mache ich falsch und wie bekomme ich es richtig?


Update: trat ich in die solution below

+0

Sehen Sie, dass: http://stackoverflow.com/questions/3669204/formsauthentication-isnt-preserving-the-userdata-field-after-postback-in-net-3/8127334#8127334 –

Antwort

5

Hier ist das Problem und Lösung war.

früher in der Entwicklung hatte ich auf die Website-Menü und klickte auf Asp gegangen . NET-Konfiguration Dies führte in der folgenden 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 thro ugh FormsAuthentication-Rollen.So die wiederholten Ausfälle, trotz der Tatsache, dass die eigentliche Authentifizierung und Rollenlogik korrekt eingerichtet wurde.

Nachdem diese Zeile aus web.config entfernt wurde, hat alles perfekt funktioniert.

0

dies nur ein zufälliger Schuss, aber sind Ihnen wegen der Reihenfolge der Genehmigung für Admin gesperrt zu werden? Vielleicht solltest du versuchen, deinen Deny-All-und-All-Admin zu wechseln.

Nur für den Fall, dass es von der Verweigerung überschrieben wird.

(hatte ich Code-Beispiele in hier, aber sie waren nicht angezeigt werden

+0

@ [JordanH] (http : //stackoverflow.com/questions/56271/contextuser-losing-roles-after-being-assigned-in-globalasaxapplicationauthentic#56506) - Von dem, was ich auf einer Reihe von Websites() gelesen habe, muss Benutzer nach Rollen zu verweigern kommen . Wenn die Verweigerung zuerst kam, würde die Erlaubnis niemals funktionieren. Die Art und Weise, wie es gerade ist, sollte bestimmte Rollen zulassen und dann jeden verweigern, der nicht zu den zuvor definierten Rollen passt. (Ich habe auch Ihren Vorschlag versucht und es hat nicht funktioniert). –