Domanda

Salve, utilizzo un MembershipProvider personalizzato.

Voglio conoscere il nome utente corrente durante uno scenario di applicazione, ma quando provo ad accedere a HttpContext.Current.User.Identity.Name restituisce sempre string.Empty.

if (Membership.ValidateUser(tbUsername.Text, tbPassword.Text))
{
    FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
    bool x = User.Identity.IsAuthenticated; //true
    string y = User.Identity.Name; //""
    FormsAuthentication.RedirectFromLoginPage(tbUsername.Text, cbRememberMe.Checked);
}

Mi manca qualcosa?

È stato utile?

Soluzione

FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""

Il problema che hai è a questo punto che stai solo impostando il cookie di autenticazione, l'IPrincipal che viene creato all'interno del modulo di autenticazione dei moduli non si verificherà fino a quando non ci sarà una nuova richiesta, quindi a quel punto HttpContext. uno stato strano. Una volta eseguito il reindirizzamento, poiché si tratta di una nuova richiesta dal browser, il cookie verrà letto prima che venga raggiunta la tua pagina e creato l'oggetto utente corretto.

I cookie vengono impostati sul browser solo dopo il completamento di una richiesta.

Dal momento che RedirectFromLoginPage crea comunque un cookie di autenticazione moduli, non è necessario farlo manualmente

Altri suggerimenti

Prova System.Web.HttpContext.Current.Request.LogonUserIdentity.Name invece di User.Identity.Name. Ha funzionato per me.

Il valore di HttpContext.Current.User.Identity.Name è impostato dalla chiamata su RedirectFromLoginPage. Puoi ottenere l'ID utente corrente da <=> una volta reindirizzato a una nuova pagina. Non sono sicuro del motivo per cui dovresti accedere al nome utente tramite la proprietà Utente in questo contesto, non potresti semplicemente utilizzare il valore contenuto in tbUsername.Text?

nella versione VS Community 2015, se si crea un'applicazione per moduli Web, aggiunge automaticamente i codici nel nodo web.config per rimuovere FormsAuthentication, provare a rimuovere sotto la sezione

<modules>
  <remove name="FormsAuthentication"/>
</modules>

Come già suggerito il metodo FormsAuthentication.RedirectFromLoginPage(), imposta automaticamente il cookie di autenticazione.

Tuttavia, nel mio caso, avevo applicazioni web nidificate in cui avevo cancellato il tag <httpModules> nell'applicazione figlio (in modo che non ereditasse i moduli http dalla sua applicazione padre) nel file web.config. La rimozione dei httpModules genitore indesiderato ha fatto funzionare di nuovo tutto.

è meglio controllare questo tag prima di complicare le cose :)

Se stai cercando il nome dell'utente dal provider di appartenenze, prova qualcosa del genere ...

var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );

Se si utilizza la riscrittura dell'URL o si modifica l'URL, potrebbe essere necessario restituire un valore Null vuoto. È consigliabile provare a cambiare il percorso dell'URL da .html a .aspx o nessuna estensione. questo è un problema per il mio caso. Ci provi. Spero che sia utile

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top