HttpContext.Aktuelle.User != HttpContext.Benutzer?
Ist HttpContext.Aktuelle.Benutzer in der global asax nicht das gleiche wie HttpContext.Benutzer in einer action-Methode? Ich wies den Benutzer einige Rollen, aber Sie scheinen sich zu verirren.
Den code unten zeigt, was passiert ist. Beide Behauptet, dass man geschlagen wird, wenn ein Benutzer angemeldet ist, zuerst in der global asax, dann die action-Methode. Aber Sie geben unterschiedliche Ergebnisse.
Ersten dieses:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
//... omitted some code to check user is authenticated
FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;
string[] roles = new string[] { "admin", "user" };
HttpContext.Current.User =
new System.Security.Principal.GenericPrincipal(identity, roles);
Assert(HttpContext.User.IsInRole("admin"));
}
Dann in meiner action-Methode:
public ActionResult Index()
{
bool isAdmin = HttpContext.User.IsInRole("admin");
Assert(isAdmin); //this fails, isAdmin is false
//...
}
Ich habe folgende Ressourcen
http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html
- Ich habe, erweitert meine Antwort um ein Kommentar darüber, warum dies geschieht, und eine Darstellung, hoffe, das hilft. Versuchen
Application_OnPostAuthenticateRequest
stattdessen, wenn Sie wirklich so arbeiten müssen, stattWebSecurity
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage-tags sagen "aspnet-mvc (3 und 4)", so haben Sie die Möglichkeit, über die folgenden, um Ihr Leben leichter machen? Wenn Sie mit Einfache Mitgliedschaft vom MVC-4-Internet-Application-template in VS2012 nur Arbeit out of the box für dich):
WebSecurity.CreateUserAndAccount(name, Passwort)
- um einen Benutzer anzulegen,Roles.AddUserToRole
(undAddUserToRoles
) - hinzufügen eines Benutzers zu einer RolleRoles.IsUserInRole
- tests, wenn ein Benutzer in eine Rolle[Autorisieren(Roles = "admin")]
-[Authorize]
durchsetzen können Rollen auf einen gesamten controller, oder auf eine AktionCreateUserAndAccount
hat den Vorteil, dass es einfach ist, legen Sie die Eigenschaften für die UserProfile, wie zum Beispiel:Bearbeiten, ich erkenne die oben nicht die Antwort auf Ihre ursprüngliche Frage zu
.User
Eigenschaft der Gleichwertigkeit.HttpContext
im Controller eine Eigenschaft:Controller.HttpContext
.HttpContext
im globalen.asax.cs ist die statische Klasse, so dass ist, warum Sie verwendenHttpContext.Current
. Sie beziehen sich auf die gleiche Sache.Wenn Sie den folgenden code ausführen, können Sie sehen, dass Sie offenbar das "gleiche Prinzip". Die Frage ist also, was passiert ist, um die Rollen, die Sie Ihnen zugeordnet?
Das problem ist, Sie zugewiesen
GenericPrincipal
zu.User
. Je nachRoleProvider
, diese können überschrieben werden (z.B. durch dieRoleManagerModule
) währendPostAuthenticateRequest
und (zum Beispiel), die sich in eineRolePrincipal
. Diese können dann verschieben zurück in die Datenbank (wieder je nach Anbieter) um die Rollen, so dass über-schreiben Sie Ihre Rollen. Wenn Sie die Arbeit inApplication_OnPostAuthenticateRequest
Sie könnte in Ordnung sein.Application_AuthenticateRequest
. die einfache änderung von Ereignis einen großen Unterschied gemacht. Dank