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