Pegar grupo de usuário do Windows e verificar .Net Core

Image

Como eu posso pegar grupo de usuário e verificar se aquela usuário pode fazer parte do grupo para entrar no sistema?

O primeiro passo é colocar na classe Startup.cs do seu projeto: //user context services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

A instância será criada quando for necessário para uso.

O segundo passo é declarar isso na sua classe: A interface IHttpContextAccessor pode te judar a pegar o contexto logado

private IHttpContextAccessor _httpContextAccessor;
private HttpContext _context { get { return _httpContextAccessor.HttpContext; } }

O terceiro passo é colocar ele no construtor da classe:

public IndexModel(ILogger<IndexModel> logger, 
	IConfiguration configuration,
	IHttpContextAccessor httpContextAccessor)
{
	_logger = logger;
	_configuration = configuration;
	_httpContextAccessor = httpContextAccessor;
}

Depois disso, eu posso verificar se existe e qual a identidade do usuário dentro do método Get da classe:

public void OnGet()
{
	if (_context != null && _context.User != null)
	{
		var identity = _context.User.Identity;
		if (identity != null && identity.IsAuthenticated)
		{
			this.UserName = identity.Name;
		}
		else
		{
			this.UserName = $"User: {identity.Name}";
		}

		CheckGroup(identity.Name);
	}
}

Para checar o grupo, é necessário verificar do domínio que necessita que no caso pode ser o domínio da sua empresa. Depois é necessário verificar a identidade e o nome do grupo. No meu caso, eu posso ter um ou vários grupos separados por vírgular. E esses grupos estão colocados no arquivo de configuração do sistema. A tag chama Groups.

public void CheckGroup(string userName)
{
	try
	{
		string[] uids = userName.Split('\\');
		var userContext = new PrincipalContext(ContextType.Domain, "drl.com");

		var upUser = UserPrincipal.FindByIdentity(userContext, userName);
		var userid = uids[1].ToString();

		string mgrsgroups = _configuration.GetSection("Groups").Value;

		if (mgrsgroups != null && mgrsgroups != "")
		{
			string[] mgrsgps = mgrsgroups.Split(',');
			foreach (var mgrgpname in mgrsgps)
			{
				if (upUser.IsMemberOf(userContext, IdentityType.SamAccountName, mgrgpname))
				{
					HttpContext.Session.SetString("UserNameCookie", upUser.DisplayName);

					Response.Redirect("Upload");
				}
				else
				{
					Response.Redirect("Forbidden");
				}
			}
		}
	}
	catch(System.Exception ex)
	{
		//this.UserName = this.UserName + " error: " + ex.Message;
		Response.Redirect("Forbidden");
	}
}

Se tivermos no mesmo grupo, verificado no método IsMemeberOf, então é gerado uma sessão com o nome do usuário. Caso contrário, é redirecionado para outra página.

Espero ter ajudado, qualquer coisa pode entrar em contato comigo pelo site https://mauriciojunior.net.

  • Mauricio Junior

    Mauricio Junior