Pergunta

Como posso acessar UserId em ASP.NET Membership sem usar Membership.GetUser(username) no projeto de aplicativo Web ASP.NET?

Pode UserId ser incluído no namespace Profile ao lado UserName (System.Web.Profile.ProfileBase)?

Foi útil?

Solução 3

Eu decidi escrever autenticação de usuários de usuários no meu próprio (muito simples, mas funciona) e eu deveria feito isso há muito tempo.

A minha pergunta original sobre UserId e não está disponível em:

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

Outras dicas

Tente isto:

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

é sua razão para isso para salvar uma vez de chamada de banco de dados é necessário o UserId? Se assim for, quando eu estou usando o ASP.NET MembershipProvider, eu geralmente quer fazer um provedor personalizado que me permite armazenar em cache essa chamada, ou um método utilitário que eu posso armazenar em cache.

Se você está pensando em colocá-lo no perfil, não vejo muita razão para fazê-lo, especialmente porque ele também continua a exigir uma chamada de banco de dados e, a menos que você estiver usando um provedor de perfil personalizado lá, ele tem a added processing de analisar o UserId.

Se você está se perguntando por que eles não implementar um método getUserId, é simplesmente porque você não está sempre garantido que esse ID de usuário será um GUID como no provedor incluídos.

EDIT:

artigo See de ScottGu sobre os prestadores que fornece uma ligação para transferir o código fonte real para isto é SqlMembershipProvider .

Mas a coisa mais simples de fazer realmente é um método getUserId () no seu objeto de usuário, ou classe de utilitário, onde você começa a UserId de cache / sessão se houver, caso contrário, atingiu o banco de dados, o cache-lo por nome de usuário (ou loja em sessão), e devolvê-lo.

Para algo mais a considerar (mas ter muito cuidado por causa de restrições de tamanho cookie): Formulários de autenticação: Composição, Funções e Perfil sem Provedores e não Session

Tente o seguinte:

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

Você tem duas opções aqui:

1) Use nome de usuário como a chave primária para sua tabela de dados do usuário ou seja:

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

2) Adicionar UserID ao perfil.

Há prós e contras de cada método. Pessoalmente eu prefiro o primeiro, porque isso significa que eu não necessariamente precisa configurar o provedor de perfil out-of-the-box, e eu prefiro fazer cumprir nomes de usuários únicos em meus sistemas de qualquer maneira.

Andrew: Eu teria cuidado de fazer uma consulta como o que você como, por padrão, não há nenhum índice que combina com que então você corre o risco de uma varredura completa da tabela. Além disso, se você estiver usando o banco de dados usuários por mais de um aplicativo, você não incluiu o ID de aplicação.

O índice mais próximo é aspnet_Users_Index que requer a ApplicationId e LoweredUserName.

EDIT:

Opa - reler o post de Andrew e ele não está fazendo um * SELECT na tabela de aspnet_Users, mas sim, uma mesa de perfil personalizado / usuário usando o nome de usuário como a chave primária

.

Eu tive esse problema, a solução está na configuração web.config, tente configurar web.config com estes:

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

lhe dará a UserID (uniqueidentifier) ??para o usuário atual da tabela de aspnet_Membership -. Fornecendo a corrente tem registrado com sucesso em Se você tentar <% =%> ou atribuir esse valor antes de uma autenticação bem sucedida, você receberá o erro "Referência de objeto não definida para uma instância de um objeto".

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

Você já tentou usar System.Web.HttpContext.Current.User.Identity.Name? (Certifique-se de verificar se User e Identity são não-nulo em primeiro lugar.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top