Login AD .Net Core API

8 respostas
.netwebapiapiprogramação
G

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

8 Respostas

G

Por acaso já deu uma olhada nesse artigo?

G

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?

G

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();
            });
        }
G

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

G

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.

G

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

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

G

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

Criado 24 de março de 2020
Ultima resposta 26 de mar. de 2020
Respostas 8
Participantes 2