Crie um mecanismo a ser redirecionado se você não fizer login usando a autenticação de cookies (ASP.NET Core 3.0)

Página atualizada :
Data de criação de página :

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.

image

selecione ASP.NET Aplicativo Web Central.

image

Especifique qualquer nome do projeto e localização do projeto.

image

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.

image

Depois de criar um projeto e depura-lo, a tela na figura abaixo aparece. Vamos criar um programa baseado nesta tela.

image

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.

image

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.

image

@{
  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.

image

<!-- 中略 -->
<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.

Resultados
Operaçã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