Estou usando o MVC5 Identity 2.0 para que os usuários façam login no meu site, onde os detalhes da autenticação são armazenados em um banco de dados SQL. A identidade do Asp.net foi implementada de maneira padrão, como pode ser encontrado em muitos tutoriais online.
A classe ApplicationUser em IdentityModels foi estendida para incluir algumas propriedades personalizadas, como um OrganizationId inteiro. A ideia é que muitos usuários possam ser criados e atribuídos a uma organização comum para fins de relacionamento com o banco de dados.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
//Extended Properties
public DateTime? BirthDate { get; set; }
public long? OrganizationId { get; set; }
//Key Mappings
[ForeignKey("OrganizationId")]
public virtual Organization Organization { get; set; }
}
Como recuperar a propriedade OrganizationId do usuário conectado no momento de dentro de um controlador? Isso está disponível por meio de um método depois que um usuário está logado ou eu sempre recupero o OrganizationId do banco de dados, com base no UserId, toda vez que um método do controlador é executado?
Lendo na web que eu vi, preciso usar o seguinte para obter o UserId conectado etc.
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
No entanto, OrganizationId não é uma propriedade disponível no User.Identity. Preciso estender User.Identity para incluir a propriedade OrganizationId? Se sim, como faço para fazer isso.
O motivo pelo qual preciso do OrganizationId com tanta frequência é que muitas consultas de tabela dependem do OrganizationId para recuperar dados relevantes para a organização associada ao usuário conectado.
Respostas:
Sempre que você desejar estender as propriedades de User.Identity com propriedades adicionais, como a pergunta acima, adicione essas propriedades à classe ApplicationUser primeiro da seguinte maneira:
Então o que você precisa é criar um método de extensão assim (eu crio o meu em uma nova pasta Extensões):
Quando você cria a identidade na classe ApplicationUser, basta adicionar o Claim -> OrganizationId da seguinte forma:
Depois de adicionar a reivindicação e ter seu método de extensão, para disponibilizá-la como uma propriedade no User.Identity, adicione uma instrução using na página / arquivo que você deseja acessá-la :
no meu caso:
using App.Extensions;
dentro de um Controller e@using. App.Extensions
dentro de um arquivo .cshtml View.EDITAR:
O que você também pode fazer para evitar adicionar uma instrução using em cada View é ir para a pasta Views e localizar o arquivo Web.config lá. Agora procure a
<namespaces>
tag e adicione o espaço para nome da sua extensão da seguinte maneira:Salve seu arquivo e pronto. Agora, todas as visualizações conhecem suas extensões.
Você pode acessar o método de extensão:
fonte
Eu estava procurando a mesma solução e Pawel me deu 99% da resposta. A única coisa que faltava para que a Extensão fosse exibida foi adicionar o seguinte Código Razor na página cshtml (exibição):
@using programname.Models.Extensions
Eu estava procurando pelo Nome, para exibir no canto superior direito da minha NavBar após o usuário fazer login.
Eu pensei que iria postar este caso ajuda alguém, então aqui está o meu código:
Criei uma nova pasta chamada Extensions (Under my Models Folder) e criei a nova classe como Pawel especificado acima:
IdentityExtensions.cs
IdentityModels.cs
:Então, nas minhas
_LoginPartial.cshtml
(UnderViews/Shared
Folders), adicionei@using.ProgramName.Models.Extensions
Em seguida, adicionei a alteração à linha de código a seguir que usaria o nome do usuário após o login:
@Html.ActionLink("Hello " + User.Identity.GetUserFirstname() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
Talvez isso ajude alguém mais na linha.
fonte
Confira esta excelente postagem de blog de John Atten: ASP.NET Identity 2.0: Personalizando usuários e funções
Possui ótimas informações passo a passo sobre todo o processo. Vá ler :)
Aqui estão alguns dos princípios.
Estenda a classe ApplicationUser padrão adicionando novas propriedades (por exemplo, endereço, cidade, estado etc.):
Em seguida, você adiciona suas novas propriedades ao seu RegisterViewModel.
Atualize a exibição do registro para incluir as novas propriedades.
Atualize o método Register () no AccountController com as novas propriedades.
fonte
Para quem encontrar essa pergunta procurando como acessar propriedades personalizadas no ASP.NET Core 2.1 - é muito mais fácil: você terá um UserManager, por exemplo, em _LoginPartial.cshtml, e poderá fazer isso simplesmente (assumindo que "ScreenName" seja um propriedade que você adicionou ao seu próprio AppUser, que herda de IdentityUser):
fonte
GetUserAsync(User)
irá consultar o banco de dados para recuperar o OrganizationId. Por outro lado, a solução aceita incluirá o OrganizationId nas reivindicações (por exemplo, cookie). A vantagem de extrair essas informações do banco de dados é que as pessoas podem ser movidas entre organizações sem exigir que elas efetuem logout / logon. Obviamente, a desvantagem é que requer uma consulta adicional ao banco de dados.O escape fornece uma boa maneira de adicionar a propriedade à classe ApplicationUser. Olhando para o código OP, parece que eles podem ter feito isso ou estavam no caminho certo. A pergunta faz
Pawel fornece uma maneira de adicionar um método de extensão que requer o uso de instruções ou a adição do namespace ao arquivo web.config.
No entanto, a pergunta pergunta se você "precisa" estender User.Identity para incluir a nova propriedade. Existe uma maneira alternativa de acessar a propriedade sem estender User.Identity. Se você seguiu o método de escape, poderá usar o código a seguir no seu controlador para acessar a nova propriedade.
fonte
Eu também adicionei ou estendi colunas adicionais à minha tabela AspNetUsers. Quando eu queria simplesmente visualizar esses dados, encontrei muitos exemplos como o código acima com "Extensões", etc ... Isso realmente me surpreendeu que você tivesse que escrever todas essas linhas de código apenas para obter alguns valores dos usuários atuais.
Acontece que você pode consultar a tabela AspNetUsers como qualquer outra tabela:
fonte