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