8

È HttpContext.Current.User in asax globale non uguale a HttpContext.User in un metodo di azione? Ho assegnato all'utente alcuni ruoli, ma sembra che si perdano.HttpContext.Current.User! = HttpContext.User?

Il codice seguente mostra cosa sta succedendo. Entrambi gli avvertimenti vengono colpiti quando un utente ha effettuato l'accesso, prima nell'asax globale, quindi nel metodo di azione. Tuttavia danno risultati diversi.

Prima questo:

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")); 
} 

Allora questo nel mio metodo di azione:

public ActionResult Index() 
{ 
    bool isAdmin = HttpContext.User.IsInRole("admin"); 

    Assert(isAdmin); // this fails, isAdmin is false 

    // ... 
} 

ho usato le seguenti risorse

This SO answer

http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html

+0

Ho ampliato la mia risposta per includere un commento sul motivo per cui ciò accade e un'illustrazione, sperare che sia d'aiuto. Prova 'Application_OnPostAuthenticateRequest' invece se devi davvero lavorare con questo invece di' WebSecurity' –

risposta

8

I tuoi tag di domanda dicono "aspnet-mvc (3 e 4)", quindi hai la possibilità di utilizzare quanto segue per semplificarti la vita? Se si utilizza Simple Membership dal MVC 4 Internet modello di applicazione in VS2012 questo sarà solo lavorare fuori dalla scatola per voi):

CreateUserAndAccount ha il vantaggio che è facile da impostare le proprietà per la ProfiloUtente così, ad esempio:

WebSecurity.CreateUserAndAccount(newUser.UserName, newUser.Password, 
    new { FullName = newUser.FullName, Email = newUser.Email, Timezone = newUser.TZ }); 
Roles.AddUserToRoles(newUser.UserName, new[] {"admin", "user"}); 

Edit, mi rendo conto che quanto sopra non rispondere alla tua domanda iniziale su .User proprietà equivalenza.

HttpContext in un controller è una proprietà: Controller.HttpContext. HttpContext in global.asax.cs è la classe statica, ecco perché si utilizza HttpContext.Current. Si riferiscono alla stessa cosa.

Se si esegue il seguente codice, è possibile vedere che sono apparentemente "lo stesso principale". Quindi la domanda è: cosa è successo ai ruoli che hai assegnato?

protected void Application_AuthenticateRequest(object sender, EventArgs e) { 
    ... 
    FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; 
    string[] roles = new string[] { "admin", "user" }; 
    identity.Label = "test label"; 
    System.Security.Principal.GenericPrincipal ppl = new System.Security.Principal.GenericPrincipal(identity, roles);    
    HttpContext.Current.User = ppl; 
... } 

public ActionResult Index() { 
    bool isAdmin = HttpContext.User.IsInRole("admin"); 
    bool isAdmin2 = System.Web.HttpContext.Current.User.IsInRole("admin"); 
    System.Web.Security.FormsIdentity identity = (System.Web.Security.FormsIdentity)HttpContext.User.Identity; 

    // The label is carried through from Application_AuthenticateRequest to Index. 
    string label = identity.Label; 
} 

Il problema è, è stato assegnato un GenericPrincipal a .User. A seconda dello RoleProvider, questo può essere sovrascritto (ad esempio dallo RoleManagerModule) durante il PostAuthenticateRequest e (ad esempio) trasformato in RolePrincipal. Questo può quindi rimandare al database (sempre in base al fornitore) per ottenere i ruoli, quindi sovrascrivere i ruoli. Se lavori in Application_OnPostAuthenticateRequest potresti essere ok.

+0

bellissime grazie - cambiare l'uso di PostAuthenticateRequest significa che posso vedere i miei ruoli nel controller. Ma grazie anche per l'idea su SimpleMembershipProvider, sto usando MVC4, quindi potrei considerare di utilizzarlo - in questo progetto o in futuro –

+0

@SeanMill. [Vedi anche la mia risposta qui] (http://stackoverflow.com/a/16734651/1945631) per maggiori informazioni su come SimpleMembership si collega. –

+0

+1, 'protected protected Application_OnPostAuthenticateRequest()' risolto e problema che stavo avendo riguardo ai ruoli esaminati in 'Application_AuthenticateRequest'. il semplice cambiamento dell'evento ha creato un mondo di differenza. Grazie –

Problemi correlati