Obter usuários nome completo do contexto da máquina
-
19-09-2019 - |
Pergunta
Tenho uma aplicação ASP.NET que é executado em nossa intranet. Na produção posso obter o usuário do contexto de domínio e ter acesso a muita informação, incluindo o seu primeiro e último nome (UserPrincipal.GivenName e UserPrincipal.Surname).
O nosso ambiente de teste não faz parte do domínio de produção e usuários de teste não têm contas de domínio no ambiente de teste. Então, nós adicioná-los como usuários da máquina local. Eles são solicitadas as credenciais quando eles navegar para a página inicial. Eu uso o seguinte método para obter o UserPrincipal
public static UserPrincipal GetCurrentUser()
{
UserPrincipal up = null;
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
up = UserPrincipal.FindByIdentity(context, User.Identity.Name);
}
if (up == null)
{
using (PrincipalContext context = new PrincipalContext(ContextType.Machine))
{
up = UserPrincipal.FindByIdentity(context, User.Identity.Name);
}
}
return up;
}
O problema que tenho aqui é que quando o UserPrinicipal é retrived quando ContextType == Máquina de eu não conseguir imóveis como GivenName ou Sobrenome. Existe uma maneira de definir esses valores ao criar o usuário (Windows Server 2008) ou que eu preciso de fazer isto de uma maneira diferente?
Solução
A função das necessidades pergunta original a ser modificada. Se você tentar acessar o objeto UserPrincipal que é retornado, você receberá um ObjectDisposedException
Além disso, o User.Identity.Name não está disponível e precisa ser passado.
Eu fiz as seguintes alterações para a função acima.
public static UserPrincipal GetUserPrincipal(String userName)
{
UserPrincipal up = null;
PrincipalContext context = new PrincipalContext(ContextType.Domain);
up = UserPrincipal.FindByIdentity(context, userName);
if (up == null)
{
context = new PrincipalContext(ContextType.Machine);
up = UserPrincipal.FindByIdentity(context, userName);
}
if(up == null)
throw new Exception("Unable to get user from Domain or Machine context.");
return up;
}
Além disso, a propriedade de UserPrincipal I necessidade de uso é DisplayName (em vez de GivenName e sobrenome);