Pergunta

Oi eu usar um MembershipProvider personalizado.

Eu quero saber o nome de usuário atual durante um cenário de aplicação, mas quando eu tente acessar HttpContext.Current.User.Identity.Name ele sempre retorna 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);
}

Estou faltando alguma coisa?

Foi útil?

Solução

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

O problema que você tem é neste momento você está definindo apenas o cookie de autenticação, o IPrincipal que é criada dentro do módulo de autenticação de formulários não vai acontecer até que haja um novo pedido - então, nesse ponto, o HttpContext.User está em um estado estranho. Uma vez que o redirecionamento acontece então, porque é um novo pedido do navegador o cookie irá ter lido antes de sua página é alcançada e o objeto de usuário correto criado.

Os cookies são definidos apenas no navegador após uma solicitação é concluída.

Como um aparte RedirectFromLoginPage cria um cookie de autenticação formulários de qualquer maneira, você não precisa fazê-lo manualmente

Outras dicas

Por favor, tente System.Web.HttpContext.Current.Request.LogonUserIdentity.Name vez de User.Identity.Name. Ela trabalhou para mim.

O valor da HttpContext.Current.User.Identity.Name é definido pela chamada para RedirectFromLoginPage. Você pode obter o ID de usuário atual do HttpContext.Current.User.Identity.Name uma vez que você será redirecionado para uma nova página. Eu não tenho certeza por que você precisa para acessar o nome de usuário por meio da propriedade User neste contexto, você não pode apenas usar o valor contido na tbUsername.Text?

em 2015 versão VS Comunidade, se você criar um aplicativo de formulários da web, ele adiciona automaticamente códigos no nó web.config para remover FormsAuthentication, tente remover abaixo seção

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

Como método FormsAuthentication.RedirectFromLoginPage() já foi sugerido, define o cookie de autenticação automaticamente.

No entanto, no meu caso, eu tinha aplicações web aninhados onde i tinham erradicado tag <httpModules> na aplicação criança (para que ele não herda httpModules de seu aplicativo pai) no arquivo web.config. Removendo o pai não desejado httpModules fez trabalho tudo de novo.

o seu melhor para verificar esta tag antes de complicar as coisas:)

Se você está procurando o nome do usuário a partir do provedor de associação, tentar algo como isto ...

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

Se você estiver usando URL reescrita ou alterar o seu URL, pode ser causa de retorno vazio nula value.You deve tentar caminho mudança de seu URL de .html para .aspx ou nenhuma extendtion. esta é uma questão para o meu case.You try.i espero que este útil

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