Como obter o usuário atual no ASP.NET MVC

268

Em um modelo de formulários, eu costumava obter o usuário conectado atual:

Page.CurrentUser

Como obtenho o usuário atual dentro de uma classe de controlador no ASP.NET MVC?

Serhat Ozgel
fonte

Respostas:

266

Se você precisar obter o usuário de dentro do controlador, use a Userpropriedade Controller. Se você precisar do ponto de vista, eu preencheria o que você precisa especificamente no ViewData, ou você pode simplesmente chamar Usuário, pois acho que é uma propriedade dele ViewPage.

Haacked
fonte
2
"ou você pode simplesmente ligar para User, pois acho que é uma propriedade do ViewPage" - Então você quer dizer usar Page.user quando estiver na visualização?
28220 mawaldne
17
Sim, você pode usá-lo como "Olá, @ User.Identity.Name!" no cshtml.
Sean
198

Descobri que Userobras, ou seja, User.Identity.Nameou User.IsInRole("Administrator").

Peter Mortensen
fonte
19
Só para acrescentar a isto, se você está trabalhando em um fora de classe de um formulário que você quer necessidade de Imports System.Webe ainda qualificar-se com com HttpContext.Current.User.Identity.Name, ou diretamente qualificar usando a sintaxe completa:System.Web.HttpContext.Current.User.Identity.Name
Paul
Funciona dentro de um Controller e, se estiver usando um ViewModel, seja herdado do Controller ou siga a sugestão de Paul.
usar o seguinte código
60

Tente HttpContext.Current.User.

Propriedade pública compartilhada Current () As System.Web.HttpContext
Membro de System.Web.HttpContext

Resumo:
Obtém ou define o objeto System.Web.HttpContext para a solicitação HTTP atual.

Valores de retorno:
O System.Web.HttpContext para a solicitação HTTP atual

pomba
fonte
2
Aparentemente, o HttpContext não possui uma propriedade chamada "Atual".
Serhat Ozgel 4/11/2008
20
Eu acredito que vocês dois estão falando sobre duas coisas diferentes. System.Web.HttpContext e a propriedade estática: System.Web.Mvc.Controller.HttpContext (que não possui uma propriedade "Atual".)
Jeff Sheldon
1
Isso funcionou em um ambiente não MVC, exatamente o que eu precisava. Obrigado! :)
Wagner da Silva
38

Você pode obter o nome do usuário no ASP.NET MVC4 assim:

System.Web.HttpContext.Current.User.Identity.Name
radbyx
fonte
4
Se você está recebendo esse erro 'System.Web.HttpContextBase' does not contain a definition for 'Current' and no extension method 'Current' accepting a first argument of type 'System.Web.HttpContextBase' could be found, sugiro fazer uma chamada absoluta como esta System.Web.HttpContext.Current.User.Identity.Name,.
Simple Sandman
21

Sei que isso é muito antigo, mas estou apenas começando com o ASP.NET MVC, então pensei em colocar meus dois centavos em:

  • Request.IsAuthenticated informa se o usuário está autenticado.
  • Page.User.Identity fornece a identidade do usuário conectado.
jrb
fonte
16

Eu uso:

Membership.GetUser().UserName

Não tenho certeza se isso funcionará no ASP.NET MVC, mas vale a pena tentar :)

Sean
fonte
De onde vem essa classe de associação? O IntelliSense não o reconhece por padrão.
Serhat Ozgel 4/08
O espaço para nome System.Web.Security. Não tenho certeza de que isso seja útil no MVC, mas eu o uso com os controles de login para Web Forms.
460 Sean Sean
1
É útil em qualquer aplicativo ASP.NET que use os provedores de associação.
jamiebarrow
2
Isso realmente fará uma solicitação de banco de dados. HttpContext.Current.User não.
Mike Cole
11

ficando logado nome de usuário: System.Web.HttpContext.Current.User.Identity.Name

tifoz
fonte
9

Para fazer referência a um ID de usuário criado usando autenticação simples incorporada ao ASP.NET MVC 4 em um controlador para fins de filtragem (o que é útil se você estiver usando o banco de dados primeiro e o Entity Framework 5 para gerar ligações primeiro ao código e suas tabelas estiverem estruturadas que uma chave estrangeira para o ID do usuário é usada), você pode usar

WebSecurity.CurrentUserId

depois de adicionar uma instrução using

using System.Web.Security;
MattC
fonte
4
Infelizmente, este não parece mais trabalhar no MVC 5. Não sei por que = /
Jed Grant
2
System.Security.Principal.WindowsIdentity.GetCurrent().Namefunciona em MVC 5. No entanto, isso abre o nome de domínio com o nome de usuário. ou seja, domínio \ nome de usuário
shaz
8

Podemos usar o seguinte código para obter o usuário conectado atual no asp.net MVC:

var user= System.Web.HttpContext.Current.User.Identity.GetUserName();

Além disso

var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; //will give 'Domain//UserName'

Environment.UserName - Will Display format : 'Username'
Raj Baral
fonte
7

Nome de usuário com:

User.Identity.Name

Mas se você precisar obter apenas o ID, poderá usar:

using Microsoft.AspNet.Identity;

Portanto, você pode obter diretamente o ID do usuário:

User.Identity.GetUserId();
Gilberto B. Terra Jr.
fonte
Este método retorna uma System.Guid
Gilberto B. Terra Jr.
User.Identity.Name é uma instância de System.Security.Principal.IPrincipal que não tem uma propriedade id ... isso é diferente do usuário do objeto User 's User.Identity.GetUserId
Samra
6

Esta página pode ser o que você está procurando:
Usando Page.User.Identity.Name no MVC3

Você só precisa User.Identity.Name.

heriawan
fonte
Isso funciona apenas dentro de um controlador; ou se seus herda ViewModel de Controlador
usefulBee
5

Use System.Security.Principal.WindowsIdentity.GetCurrent().Name.

Isso obterá o usuário atual do Windows conectado.

Clay Smith
fonte
1
Embora esse código possa responder à pergunta, seria melhor incluir algum contexto, explicar como ele funciona e descrever quando usá-lo. Respostas somente de código não são úteis a longo prazo.
Ryanyuyu
System.Security.Principal.WindowsIdentity.GetCurrent (). Name retorna o usuário atual conectado ao Windows, o OP está solicitando o usuário atualmente conectado ao site.
GrandMasterFlush
4

Quanto vale a pena, no ASP.NET MVC 3, você pode simplesmente usar User, que retorna o usuário para a solicitação atual.

Pieter
fonte
4

Se você estiver dentro da sua página de login, no evento LoginUser_LoggedIn, por exemplo, Current.User.Identity.Name retornará um valor vazio; portanto, você deve usar a propriedade yourLoginControlName.UserName.

MembershipUser u = Membership.GetUser(LoginUser.UserName);
amor ao vivo
fonte
4

Você pode usar o seguinte código:

Request.LogonUserIdentity.Name;
Rajeev Jayaswal
fonte
Isso fornece o nome de usuário do AppPool em que o aplicativo está sendo executado.
Jason Geiger
3
IPrincipal currentUser = HttpContext.Current.User;
bool writeEnable = currentUser.IsInRole("Administrator") ||
        ...
                   currentUser.IsInRole("Operator");
Gediminas Bukauskas
fonte
2
var ticket = FormsAuthentication.Decrypt(
                    HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value);

if (ticket.Expired)
{
    throw new InvalidOperationException("Ticket expired.");
}

IPrincipal user =  (System.Security.Principal.IPrincipal) new RolePrincipal(new FormsIdentity(ticket));
Ognyan Dimitrov
fonte
2

Se você estiver trabalhando no Active Directory em uma intranet, aqui estão algumas dicas:

(Windows Server 2012)

A execução de qualquer coisa que converse com o AD em um servidor da web requer várias alterações e paciência. Como, quando executado em um servidor Web versus o IIS / IIS Express local, ele é executado na identidade do AppPool, é necessário configurá-lo para representar quem acessa o site.

Como obter o usuário conectado atual em um diretório ativo quando o aplicativo ASP.NET MVC estiver sendo executado em um servidor Web dentro da rede:

// Find currently logged in user
UserPrincipal adUser = null;
using (HostingEnvironment.Impersonate())
{
    var userContext = System.Web.HttpContext.Current.User.Identity;
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["AllowedDomain"], null,
                                                ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
    adUser = UserPrincipal.FindByIdentity(ctx, userContext.Name);
}
//Then work with 'adUser' from here...

Você deve encerrar todas as chamadas relacionadas ao 'contexto do diretório ativo' a seguir, para que ele atue como o ambiente de hospedagem para obter as informações do AD:

using (HostingEnvironment.Impersonate()){ ... }

Você também deve ter impersonatedefinido como true no seu web.config:

<system.web>
    <identity impersonate="true" />

Você deve ter a autenticação do Windows ativada no web.config:

<authentication mode="Windows" />
Beau D'Amore
fonte
Eu não acredito nisso, pois isso está explicitamente usando suas credenciais de usuário do Active Directory. Por que você teria 'Formulários' se deseja que seus usuários sejam autenticados via AD?
Beau D'Amore
Em nossa organização, existem locais onde temos duas estações de trabalho que são compartilhadas por várias pessoas "de campo". Por isso, somos obrigados a adicionar a página de login aos nossos aplicativos da intranet.
Patee Gutee
como solução alternativa: você pode ter duas cópias desse aplicativo em execução, uma no modo 'Formulários' com suas próprias tabelas de identidade ou pode misturar as duas em um aplicativo, mas é mais complicado. Um rápido google revelou isso: stackoverflow.com/questions/2250921/…
Beau D'Amore
<identity impersonate = "true" /> talvez seja necessário alterar se misturar
Beau D'Amore
2

No Asp.net Mvc Identity 2, você pode obter o nome de usuário atual:

var username = System.Web.HttpContext.Current.User.Identity.Name;
Fereydoon Barikzehy
fonte
1

No Gerenciador do IIS, em Autenticação, desative: 1) Autenticação Anônima 2) Autenticação de Formulários

Em seguida, adicione o seguinte ao seu controlador, para lidar com teste versus implantação do servidor:

string sUserName = null;
string url = Request.Url.ToString();

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
Daniel King
fonte