Pregunta

¿Cómo puedo acceder? UserId en membresía ASP.NET sin usar Membership.GetUser(username) en el proyecto de aplicación web ASP.NET?

Poder UserId ser incluido en Profile espacio de nombres al lado de UserName (System.Web.Profile.ProfileBase)?

¿Fue útil?

Solución 3

Decidí escribir la autenticación de usuarios usuarios por mi cuenta (muy simple pero funciona) y debería hacerlo hace mucho tiempo.

Mi pregunta original era sobre UserId y no está disponible en:

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

Otros consejos

Prueba esto:

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

¿Es su razón para que esto guarde una llamada a la base de datos cada vez que necesita el ID de usuario? Si es así, cuando uso el proveedor de membresía ASP.NET, generalmente hago un proveedor personalizado que me permite almacenar en caché esa llamada o un método de utilidad que puedo almacenar en caché.

Si está pensando en ponerlo en el Perfil, no veo muchas razones para hacerlo, especialmente porque también requerirá una llamada a la base de datos y, a menos que esté utilizando un proveedor de perfil personalizado allí, tiene el procesamiento agregado de análisis del ID de usuario.

Si se pregunta por qué no implementaron un método GetUserId, es simplemente porque no siempre se garantiza que esa identificación de usuario sea un GUID como en el proveedor incluido.

EDITAR:

Consulte el artículo de ScottGu sobre proveedores que proporciona un enlace para descargar el código fuente real por ejemplo, SqlMembershipProvider .

Pero lo más simple es hacer un método GetUserId () en su objeto de usuario, o clase de utilidad, donde obtiene el UserId del caché / sesión si está allí, de lo contrario, presione la base de datos, almacénelo por nombre de usuario (o almacénelo en sesión) y devuélvelo.

Para algo más a considerar (pero tenga mucho cuidado debido a las restricciones de tamaño de las cookies): Autenticación de formularios: membresía, roles y perfil sin proveedores y sin sesión

Pruebe lo siguiente:

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

Tienes dos opciones aquí:

1) Use el nombre de usuario como clave principal para su tabla de datos de usuario es decir:

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

2) Agregar ID de usuario al perfil.

Hay ventajas y desventajas de cada método. Personalmente, prefiero el primero, porque significa que no necesariamente necesito configurar el proveedor de perfiles listo para usar, y prefiero aplicar nombres de usuario únicos en mis sistemas de todos modos.

Andrew: Tendría cuidado de hacer una consulta como la que ha mostrado de forma predeterminada, no hay índice que coincida con eso, por lo que corre el riesgo de un escaneo completo de la tabla. Además, si está utilizando su base de datos de usuarios para más de una aplicación, no ha incluido la identificación de la aplicación.

El índice más cercano es aspnet_Users_Index, que requiere ApplicationId y LoweredUserName.

EDITAR:

Vaya, vuelva a leer la publicación de Andrew y no está haciendo una selección * en la tabla aspnet_Users, sino más bien, una tabla personalizada de perfil / usuario que utiliza el nombre de usuario como clave principal.

Tuve este problema, la solución está en la configuración de web.config, intente configurar web.config con estos:

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

Le dará el ID de usuario (identificador único) para el usuario actual de la tabla aspnet_Membership, siempre que la corriente haya iniciado sesión correctamente. Si intenta <% =% > o asigne ese valor antes de una autenticación exitosa, obtendrá el error " Referencia de objeto no establecida en una instancia de un objeto " ;.

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

¿Has intentado usar System.Web.HttpContext.Current.User.Identity.Name?(Asegúrese de verificar que User y Identity son no nulos primero.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top