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
Sehen Sie, dass: http://stackoverflow.com/questions/3669204/formsauthentication-isnt-preserving-the-userdata-field-after-postback-in-net-3/8127334#8127334 –