Skip to content

Instantly share code, notes, and snippets.

@almeidaalex
Last active December 11, 2020 22:00
Show Gist options
  • Save almeidaalex/0bc65955c5158f3a93ea86c9d3186378 to your computer and use it in GitHub Desktop.
Save almeidaalex/0bc65955c5158f3a93ea86c9d3186378 to your computer and use it in GitHub Desktop.
Autenticação por cookies
/*
7. No método Autentica dentro do UsuarioController , se o model estiver válido, use o método
Busca para verificar se o usuário existe. Se existir, coloque o usuário na sessão do servidor antes de
redirecionar para a action Index do PostController . Caso contrário, mostre novamente o
formulário de login com a seguinte mensagem de erro "Login ou senha incorretos" :
*/
public async Task<IActionResult> Autentica(LoginViewModel login, string returnUrl = null)
{
if (ModelState.IsValid)
{
Usuario usuario = dao.Busca(login.LoginName, login.Password);
if (usuario == null)
{
ModelState.AddModelError("login.invalido", "Login ou senha incorretos");
return View("Login");
}
ClaimsIdentity identidade =
new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, usuario.Nome) ,
new Claim(ClaimTypes.NameIdentifier, usuario.Id.ToString())
},
CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(identidade), new AuthenticationProperties());
return LocalRedirect(returnUrl ?? "/Admin");
}
return View("Login", login);
}
//Vamos precisar modificar tb a nossa action que login, para que possa receber o parâmetro returnURL
public IActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
//E também nossa, view, para que possa repassar a url para a Action que autentica
@model LoginViewModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Resenha Cultural - Login</title>
<link rel="stylesheet" href="~/css/bootstrap.css" type="text/css" />
<link rel="stylesheet" href="~/css/estilo.css" type="text/css" />
</head>
<body>
<div class="container">
<main id="login-form">
<h2>Resenha Cultural - Login</h2>
@Html.ValidationSummary()
@using (Html.BeginForm("Autentica", "Usuario", new { ReturnUrl = ViewBag.ReturnUrl } , FormMethod.Post))
{
@Html.LabelFor(u => u.LoginName)
<input asp-for="LoginName" class="form-control" />
@Html.LabelFor(u => u.Password)
<input asp-for="Password" class="form-control" type="password" />
<input type="submit" value="Login" />
}
</main>
</div>
</body>
</html>
/*
8. Por vim, precisamos informar a aplicação que era irá utilizar autenticação por cookies
*/
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.LoginPath = "/Usuario/Login"; //nossa página de login
});
services
.AddControllersWithViews()
.AddRazorRuntimeCompilation();
// demais códigos abaixo...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// demais códigos acima
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
//app.UseEndpoints(endpoints =>
}
/*
9. Para que nossa aplicação possa protejer a controller incluir o atributo Authorize.
*/
[Authorize]
[Area("Admin")]
public class PostController : Controller
{
private readonly PostDAO dao;
public PostController(PostDAO dao)
{
this.dao = dao;
}
// demais códigos abaixo
}
/*
Exercício 10.15
No item 2 do exercício, modifique da maneira abaixo, como não estamos usando sessão, devemos recuperar o usuário,
através do claim que usamos para gravar o id.
*/
[HttpPost]
public IActionResult Adiciona(Post post)
{
if (ModelState.IsValid)
{
int usuarioId = Convert.ToInt32(HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value);
Usuario autor = usuarioDAO.BuscaPorId(usuarioId);
dao.Adiciona(post, autor);
return RedirectToAction("Index");
}
return View("Novo", post);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment