.Net Core — Cookie 身份验证

目录

[步骤 1:创建登录视图模型](#步骤 1:创建登录视图模型)

[步骤 2:创建视图](#步骤 2:创建视图)

[步骤 3:更新 _Layout(用于导航栏)](#步骤 3:更新 _Layout(用于导航栏))

[步骤 4:更新控制器](#步骤 4:更新控制器)

[步骤 5:更新 Program.cs](#步骤 5:更新 Program.cs)

[补充说明:在其他课程中使用 cookie](#补充说明:在其他课程中使用 cookie)


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

在本教程中,我们将学习如何使用 cookie 在我们的应用程序中进行身份验证。

步骤 1:创建登录视图模型

using System.ComponentModel.DataAnnotations;

namespace BlogApp.Models {

public class LoginViewModel {

Required

EmailAddress

Display(Name = "Email" )

public string? Email { get ; set ; }

Required

DataType(DataType.Password)

Display(Name = "Password" )

public string? Password { get ; set ; }

}

}

步骤 2:创建视图

@model LoginViewModel

<div class="row">

<div class="col-12">

<div class="bg-white p-4">

<h1>Login</h1>

<form asp-controller="User" asp-action="Login" method="post">

<div asp-validation-summary="ModelOnly" class="text-danger"></div>

<div class="mb-3">

<label asp-for="Email" class="form-label"></label>

<input asp-for="Email" class="form-control">

<span asp-validation-for="Email" class="text-danger"></span>

</div>

<div class="mb-3">

<label asp-for="Password" class="form-label"></label>

<input asp-for="Password" class="form-control">

<span asp-validation-for="Password" class="text-danger"></span>

</div>

<button type="submit" class="btn btn-primary">Login</button>

</form>

</div>

</div>

</div>

步骤 3:更新 _Layout(用于导航栏)

<ul class="navbar-nav ms-auto">

@if(User.Identity!.IsAuthenticated){

<li class="nav-item">

<a href="#" class="nav-link">@User.Identity.Name</a>

</li>

<li class="nav-item">

<a href="/logout" class="nav-link">Logout</a>

</li>

}

else{

<li class="nav-item">

<a href="/login" class="nav-link">Login</a>

</li>

}

</ul>

步骤 4:更新控制器

HttpPost

public async Task<IActionResult> Login(LoginViewModel model){

try{

if(!ModelState.IsValid){

ModelState.AddModelError("", "Invalid Credentials");

return View(model);

}

var user = _userRepository.Users.FirstOrDefault(o => o.Email == model.Email && o.Password == model.Password);

if(user == null){

ModelState.AddModelError("", "Invalid Credentials");

return View(model);

}

// COOKIE

var claims = new List<Claim>();

claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()));

claims.Add(new Claim(ClaimTypes.Name, user.UserName ?? ""));

claims.Add(new Claim(ClaimTypes.GivenName, user.Name ?? ""));

claims.Add(new Claim(ClaimTypes.Role, "User"));

var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); // delete old cookie if exist

await HttpContext.SignInAsync( // add new cookie

CookieAuthenticationDefaults.AuthenticationScheme,

new ClaimsPrincipal(claimsIdentity),

new AuthenticationProperties{IsPersistent = true} // remember me

);

return RedirectToAction("Index", "Post");

}

catch(Exception e){

ModelState.AddModelError("", e.Message);

return View(model);

}

}

步骤 5:更新 Program.cs

// Cookie Authentication

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();

...

// Authentication & Authorization

app.UseRouting();

app.UseAuthentication();

app.UseAuthorization();

var claims = User.Claims;

...

var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);

var userName = User.FindFirstValue(ClaimTypes.Name);

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
1-1=03 天前
C# IO和序列化
c#·.net·.netcore
宝桥南山4 天前
.NET 11 - 尝试一下Blazor中的新特性SupplyParameterFromTempData
microsoft·微软·c#·asp.net·.net·.netcore
1-1=05 天前
C# 特性(Attribute)
c#·.net·.netcore
淡海水6 天前
10-01-互操作-C#与C++边界的内存管理
unity·c#·游戏引擎·.netcore·gc
1-1=06 天前
C# 反射
c#·.net·.netcore
1-1=07 天前
C# 泛型
c#·.net·.netcore
李纲明8 天前
WordPress 登录后跳回登录页或提示「Cookie 被阻止」:先核站点 URL 与 HTTPS 一致,再查安全插件与 CDN
https·登录·cdn·wordpress·cookie·devdiy·站点url
Thanks_ks8 天前
Cookie 和 Session 到底是什么关系——登录态是怎么维持的
分布式·http·jwt·cookie·session·后端开发·登录态
淡海水9 天前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
1-1=09 天前
.NET Core 编译技术
.net·.netcore