Last active
December 11, 2020 22:00
-
-
Save almeidaalex/0bc65955c5158f3a93ea86c9d3186378 to your computer and use it in GitHub Desktop.
Autenticação por cookies
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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