Domanda

Come posso accedere UserId in ASP.NET Adesione senza l'utilizzo di Membership.GetUser(username) in ASP.NET Progetto di Applicazione Web?

Può UserId essere inclusi in Profile spazio dei nomi accanto a UserName (System.Web.Profile.ProfileBase)?

È stato utile?

Soluzione 3

Ho deciso di scrivere l'autenticazione degli utenti utenti per conto mio (molto semplice ma funziona) e avrei dovuto farlo molto tempo fa.

La mia domanda originale riguardava UserId e non è disponibile da:

System.Web.HttpContext.Current.User.Identity.Name

Altri suggerimenti

Prova questo:

MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);

Il tuo motivo è quello di salvare una chiamata al database ogni volta che hai bisogno di UserId? In tal caso, quando utilizzo ASP.NET MembershipProvider, di solito eseguo un provider personalizzato che mi consente di memorizzare nella cache quella chiamata o un metodo di utilità che posso memorizzare nella cache.

Se stai pensando di inserirlo nel profilo, non vedo molte ragioni per farlo, soprattutto perché richiederà anche una chiamata al database e, a meno che tu non stia utilizzando un provider di profili personalizzato, ha il aggiunta elaborazione dell'analisi UserId.

Se ti stai chiedendo perché non hanno implementato un metodo GetUserId, è semplicemente perché non sei sempre sicuro che quell'ID utente sarà un GUID come nel provider incluso.

EDIT:

Vedi L'articolo di ScottGu sui provider che fornisce un per il download del codice sorgente effettivo per esempio SqlMembershipProvider .

Ma la cosa più semplice da fare in realtà è un metodo GetUserId () nell'oggetto utente o nella classe di utilità, in cui si ottiene l'Idutente dalla cache / sessione, se presente, altrimenti si accede al database, si memorizza nella cache per nome utente (o si archivia in sessione) e restituirlo.

Per qualcosa in più da considerare (ma fai molta attenzione a causa delle restrizioni sulla dimensione dei cookie): Moduli Auth: Iscrizione, ruoli e profilo senza provider e senza sessione

Prova quanto segue:

Membership.GetUser().ProviderUserKey
public string GetUserID()
            {
                MembershipUser _User;
                string _UserId = "";
                _User = Membership.GetUser();
                Guid UserId = (Guid)_User.ProviderUserKey;
                return _UserId = UserId.ToString();
            }

Hai due opzioni qui:

1) Usa il nome utente come chiave primaria per la tabella dei dati utente cioè:

select * from [dbo.User] where Username = 'andrew.myhre'

2) Aggiungi UserID al profilo.

Ci sono pro e contro per ogni metodo. Personalmente preferisco il primo, perché significa che non ho necessariamente bisogno di impostare il provider di profili predefinito e preferisco comunque applicare nomi utente univoci nei miei sistemi.

Andrew: starei attento a fare una query come quella che hai mostrato per impostazione predefinita, non esiste un indice che corrisponda a quello, quindi corri il rischio di una scansione completa della tabella. Inoltre, se stai utilizzando il database degli utenti per più di un'applicazione, non hai incluso l'id dell'applicazione.

L'indice più vicino è aspnet_Users_Index che richiede ApplicationId e LoweredUserName.

EDIT:

Spiacenti, rileggi il post di Andrew e non sta eseguendo una selezione * nella tabella aspnet_Users, ma piuttosto un profilo personalizzato / tabella utente che utilizza il nome utente come chiave primaria.

Ho avuto questo problema, la soluzione è nella configurazione web.config, prova a configurare web.config con questi:

 <roleManager
             enabled="true"
             cacheRolesInCookie="true"
             defaultProvider="QuickStartRoleManagerSqlProvider"
             cookieName=".ASPXROLES"
             cookiePath="/"
             cookieTimeout="30"
             cookieRequireSSL="false"
             cookieSlidingExpiration="true"
             createPersistentCookie="false"
             cookieProtection="All">
  <providers>
    <add name="QuickStartRoleManagerSqlProvider"
        type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        connectionStringName="ASPNETDB"
        applicationName="SecurityQuickStart"/>
  </providers>
</roleManager>
{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}

Vi darà la UserID (di tipo uniqueidentifier) per l'utente corrente da aspnet_Membership tabella che fornisce la corrente è collegato con successo.Se si tenta di <%= %> o assegnare tale valore prima di autenticazione ha esito positivo, verrà visualizzato l'errore "riferimento a un Oggetto non impostato su un'istanza di oggetto".

http://www.tek-tips.com/viewthread.cfm?qid=1169200&page=1

Hai provato a usare System.Web.HttpContext.Current.User.Identity.Name? (Assicurati di verificare che User e Identity siano prima non nulli.)

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