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?

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.


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").


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


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

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.

16

Eu uso:

Membership.GetUser().UserName

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


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


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;

4
Infelizmente, este não parece mais trabalhar no MVC 5. Não sei por que = /
— Jed Grant

2
Só 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'

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

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


5

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

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


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.


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

4

Você pode usar o seguinte código:

Request.LogonUserIdentity.Name;

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");

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

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" />

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;

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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.