Login AD .Net Core API

Boa tarde!
Estou tendo dificuldade em desenvolver uma API .Net Core que realize uma autenticação com o AD.
Consegui desenvolver uma parte, para logar ele só está aceitando o Username conectado no próprio AD, porém a senha eu quero que seja igual a senha do AD do próprio usuário.

using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using Identity.Models;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Identity.Controllers
{
public class UsuarioController : Controller
{
public IActionResult Index()
{
return View();
}

    public IActionResult LoginPage()
    {
        if (User.Identity.IsAuthenticated)
        {
            return RedirectToAction("UserPage");
        }

        return View();
    }

    [HttpPost]
    public IActionResult LoginPage(Usuario usuario)
    {
        try
        {
            if (ModelState.IsValid)
            {
                if (usuario.Login == System.Environment.UserName && usuario.Senha == "123")
                {
                    Login(usuario);
                    return RedirectToAction("UserPage");
                }
                else
                {
                    ViewBag.Erro = "Usuário e / ou senha incorretos!";
                }
            }
        }
        catch (Exception)
        {
            ViewBag.Erro = "Ocorreu algum erro ao tentar se logar, tente novamente!";
        }
        return View();
    }

    private async void Login(Usuario usuario)
    {
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, usuario.Login),
            new Claim(ClaimTypes.Role, "Usuario_Comum")
        };

        var identidadeDeUsuario = new ClaimsIdentity(claims, "Login");
        ClaimsPrincipal claimPrincipal = new ClaimsPrincipal(identidadeDeUsuario);

        var propriedadesDeAutenticacao = new AuthenticationProperties
        {
            AllowRefresh = true,
            ExpiresUtc = DateTime.Now.ToLocalTime().AddHours(2),
            IsPersistent = true
        };

        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, claimPrincipal, propriedadesDeAutenticacao);
    }

    [Authorize]
    public IActionResult UserPage()
    {
        return View();
    }

    public async Task<IActionResult> Logout()
    {
        await HttpContext.SignOutAsync();
        return RedirectToAction("Index");
    }
}

}

Estou pegando o nome de usuário com o System.Environment.UserName;
E a senha está fixa como “123”, teria algum jeito de pegar a senha desse usuário?

Se puderem dar um exemplo seria ótimo.
Desde já eu agradeço!!

Por acaso já deu uma olhada nesse artigo?

1 curtida

Dei uma olhada e funciona, porém ele habilita o login somente no firefox, o meu front end está em React js, e quando tento fazer um post nessa api com login e senha ele dá um bloqueio de CORS na minha aplicação, você saberia me dizer o motivo?

Você tem que habilitar o CORS da sua API.

No arquivo Startup.cs, vá até o metodo Configure e adicione a linha app.UseCors(x => x.AllowAnyMethod().AllowAnyOrigin().AllowAnyHeader());

Ficará algo parecido com isso:

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();
            app.UseCors(x => x.AllowAnyMethod().AllowAnyOrigin().AllowAnyHeader());
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
1 curtida

Este é o código que estou utilizando para habilita-lo

public void ConfigureServices(IServiceCollection services)
        {

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddCors();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseAuthentication();
            app.UseHttpsRedirection();

            app.UseCors(x => x.AllowAnyMethod().AllowAnyOrigin().AllowAnyHeader());
        }

Minha Controller eu recebo:

[Route("iisauthorize")]
        [HttpGet]
        public IActionResult IISAuthorize()
        {
            var name = HttpContext.User.Claims.FirstOrDefault(p => p.Type == ClaimTypes.Name)?.Value;
            return new ContentResult() { Content = $@"IIS authoorized. AD: {name}" };
        }

No meu front eu uso React.js

Axios.get(https://localhost:44397/api/values/iisauthorize/)
      .then((response) => {
        this.showSuccess();
        this.setState({ item: response.data })
        console.log(this.state.item);
      })
      .catch((error) => {
        this.showError();
        console.log(error);
      });

Logo de cara eu recebo esse erro
Access to XMLHttpRequest at 'https://localhost:44397/api/values/iisauthorize/' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Não sei onde estou errando

Em ConfigureServices, altere a ordem que você chama as funções. Chame AddCors() primeiro e AddMvc() depois, a mesma coisa vale para o método Configure.

1 curtida

Mudei porém mesmo assim não deu certo, continua dando o mesmo erro

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors();
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseCors(x => x.AllowAnyMethod().AllowAnyOrigin().AllowAnyHeader());

    app.UseHttpsRedirection();
    app.UseMvc();
}

Por gentileza, confirme se tudo está na mesma ordem do trecho de código acima. Caso esteja e mesmo assim não funcione, não faço ideia do que possa ser. Revisei algumas API’s .Net Core que tenho e todos CORS foram ativados dessa mesma forma.

1 curtida

Está :/, e não funcionou, talvez seja no meu front o problema, algo assim, eu vou dar uma revisada, mas eu resolvi o meu problema usando um Iframe… Eu só precisava verificar se está logado ou não aí eu pego o nome de usuário dele.
Caso eu consiga resolver esse problema de CORS eu mostro como fiz aqui no fórum.
MUITO OBRIGADO por me ajudar! Eu agradeço de verdade!!

1 curtida