Crie um mecanismo a ser redirecionado se você não fizer login usando a autenticação de cookies (ASP.NET Core 3.0)
Ambiente
- Estúdio Visual
-
- Visual Studio Community 2019
- núcleo ASP.NET
- 3.0 ou posterior
A autenticação de cookies pode ser usada no .NET Core 2.2 ou anterior, mas nossas dicas incluem código especificamente para .NET Core 3.0 e posterior.
No começo
ASP.NET Core usa a autenticação de cookies como mecanismo de autenticação de login. Você pode pensar na autenticação de cookies como algo semelhante à autenticação de formas tradicionais.
Outra maneira de autenticar ASP.NET Core é ASP.NET Identidade Central. Além da autenticação usando formulários, autenticação de api, serviços de login externo, gerenciamento de senhas e reset, etc. Você pode usar um monte de funções. No entanto, do ponto de vista de apenas fazer uma simples tela de login desta vez, torna-se um mecanismo de autenticação um pouco exagerada Eu não uso neste momento.
Nas dicas para autenticação de cookies, você não pode exibir nada além da tela de login, a menos que faça login. Se você tentar ir para uma tela diferente, você será redirecionado para a tela de login. Você também pode ver outras telas fazendo login.
Depois de inserir seu nome de usuário e senha na tela de login, você pode fazer login. A autenticação do próprio usuário é implementada em uma posição temporária. Uma vez que a principal implementação da autenticação de cookies é a última desta vez, o processo de julgamento, como se a senha está correta, não é essencial.
Esta dicas lista o programa em parte. Baixe o programa completo para o código completo.
Criar um projeto
Inicie o Visual Studio e crie um novo projeto.
selecione ASP.NET Aplicativo Web Central.
Especifique qualquer nome do projeto e localização do projeto.
Desta vez, usaremos projetos de mvc, mas a maioria dos outros modelos pode ser substituído.
Para autenticação, selecione Sem autenticação. Se você escolher outra autenticação, você usará ASP.NET Identidade Central.
Depois de criar um projeto e depura-lo, a tela na figura abaixo aparece. Vamos criar um programa baseado nesta tela.
Editar Startup.cs
Startup.cs adicionar as definições necessárias para autenticação de cookies. Uso de namespaces:
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
Você pode habilitar a autenticação de cookies executando os métodos AddAuthentication e AddCookie. Especifique CookiesAuthenticationDefaults.AuthenticationScheme se você não precisar alterar o nome do esquema em particular.
As opções do método de autorização de adição. Se você especificar RequireAuthenticatedUser in FallbackPolicy, Todos os controladores podem ter uma política de autenticação necessária aplicada à ação. Também é útil no sentido de que o código é reduzido e o erro de descrição é evitado se a autenticação for necessária além da tela de login. Somente a tela de login escreverá o código que não requer autenticação individualmente.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Cookie による認証スキームを追加する
services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
services.AddAuthorization(options =>
{
// AllowAnonymous 属性が指定されていないすべての Action などに対してユーザー認証が必要となる
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
}
Adicione autenticação ao seu aplicativo. Adicionar Autenticação de uso(). O local de descrição é baseado na documentação do MSDN. Coloque em frente ao UseAuthorization(). Todo o resto continua sendo um modelo.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. ...
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication(); // [追加] 認証
app.UseAuthorization(); // 認可
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Criando um Controlador de Contas
Crie os controladores e ações necessários para criar uma tela de login. O nome do controlador é criado como AccountController. Isso porque, por padrão, o nome do controlador e o nome de ação da tela de login são determinados como "~/Conta/Login". Se você quiser mudar esse caminho, você pode alterá-lo com as opções do método AddCookie em Startup.cs. Vamos continuar com as configurações padrão.
O primeiro passo é criar o lado do controlador. Ao conceder o atributo AllowAnonymous, todas as ações nele podem ser executadas mesmo que não sejam autenticadas. Isso permite que apenas a tela de login seja acessada sem autenticação.
O atributo AllowAnonymous é independente da autenticação de cookies como um local diferente da tela de login. Também pode ser usado em controladores somente api.
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
namespace CookieAuthentication.Controllers
{
<remarks>
<see cref="AllowAnonymous"/> 属性は Cookie 認証していなくてもアクセスできる Action (Controller) であることを示す。
</remarks>
[AllowAnonymous]
public class AccountController : Controller
{
}
}
Defina os usuários e senhas que podem ser conectados. Originalmente eu guardo para um banco de dados, mas desta vez o julgamento do usuário não é o foco principal Eu faço isso por um conjunto temporário.
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; }
public AccountController()
{
// 仮のユーザーを登録する
UserAccounts = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
}
Esta é uma ação para exibir a tela de login. Retorne a exibição como ela é porque ela só é exibida.
<summary>ログイン画面を表示します。</summary>
public IActionResult Login()
{
return View();
}
Processo de autenticação após pressionar o botão de login. Se o nome de usuário e a senha coincidirem, ele pode ser autenticado.
O código a seguir define reivindicação, identidade e Pricinpal como o código mínimo necessário para autenticação. Chamar o método HttpContext.SignInAsync gera um cookie e o autentica.
Se forem necessárias reclamações adicionais ou os cookies expirarem, adicione parâmetros.
Após o login, redirecionamos para ~/Home/Index, que requer autenticação.
<summary>ログイン処理を実行します。</summary>
[HttpPost]
public async Task<IActionResult> Login(string userName, string password)
{
// ユーザーの存在チェックとパスワードチェック (仮実装)
// 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
if (UserAccounts.TryGetValue(userName, out string getPass) == false || password != getPass)
{
return View();
}
// サインインに必要なプリンシパルを作る
var claims = new[] { new Claim(ClaimTypes.Name, userName) };
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(identity);
// 認証クッキーをレスポンスに追加
await HttpContext.SignInAsync(principal);
// ログインが必要な画面にリダイレクトします
return RedirectToAction(nameof(HomeController.Index), "Home");
}
Insira o processo de logout. Você pode excluir um cookie e devolvê-lo a um estado não-lo, chamando o método HttpContext.SignOutAsync.
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> Logout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// ログイン画面にリダイレクト
return RedirectToAction(nameof(Login));
}
Criar uma exibição (formulário de login) (/Views/Account/Login.cshtml)
Como não levamos isso em conta, adicione um campo para inserir seu nome de usuário e senha, como mostrado na figura abaixo, e coloque um botão para fazer login. Você também deve colocar um link para acessar home/index sem fazer login para fins de teste.
Como é problemático inserir o nome de usuário e a senha, o valor inicial é definido.
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Login</title>
</head>
<body>
<form method="post">
<input name="userName" type="text" placeholder="ユーザー名" value="user1" />
<input name="password" type="password" placeholder="パスワード" value="password1" />
<button type="submit">ログイン</button>
</form>
<p><a asp-controller="Home" asp-action="Index">認証が必要な画面へ直接リンク</a></p>
</body>
</html>
Crie um link de logout (/Views/Shared/_Layout.cshtml)
A tela inicial não mudará nada, mas você terá um link de logout na barra de navegação. Além disso, eu também vou colocar um link que transita para a tela de login sem sair para fins de teste.
<!-- 中略 -->
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</li>
<!-- ここから追加 -->
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="Account" asp-action="Logout">Logout</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="Account" asp-action="Login">ログアウトせずログインへ</a>
</li>
<!-- ここまで追加 -->
</ul>
</div>
<!-- 中略 -->
Operação de verificação
Você já completou a implementação mínima necessária para autenticação de cookies. Tente fazer isso e veja como funciona. Ele deve mudar o comportamento dependendo se você está logado ou não. Como um exemplo simples, eu acho que você pode ver o seguinte comportamento.
ResultadosOperação | ◗ | da Operação |
---|---|---|
Vá para casa sem fazer login | ⇒ | Redirecione para tela de login |
Login | ⇒ | Ir para home screen |
Saia de casa e vá para casa sem fazer login | ⇒ | Redirecione para tela de login |
Não saia de casa e vá para casa sem fazer login | ⇒ | Ir para home screen |