.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);

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

相关推荐
宝桥南山11 小时前
Microsoft Fabric - 试一下在Blazor应用中使用 GraphQL API去连接Lakehouse
microsoft·c#·asp.net·.netcore·fabric·db
猹叉叉(学习版)12 小时前
【ASP.NET CORE】 11. SignalR
笔记·后端·c#·asp.net·.netcore
86Eric2 天前
一文理清:ASP.NET 项目类型全解析(从 Web Forms 到 .NET Core)
asp.net·.netcore
猹叉叉(学习版)2 天前
【ASP.NET CORE】 10. 数据校验
笔记·后端·c#·asp.net·.netcore
武藤一雄2 天前
C# 引用传递:深度解析 ref 与 out
windows·microsoft·c#·.net·.netcore
武藤一雄2 天前
告别繁琐的 out 参数:C# 现代元组(ValueTuple)如何重构你的方法返回值
microsoft·c#·asp.net·.net·.netcore
猹叉叉(学习版)3 天前
【ASP.NET CORE】 9. 托管服务
数据库·笔记·后端·c#·asp.net·.netcore
猹叉叉(学习版)4 天前
【ASP.NET CORE】 6. 中间件
数据库·笔记·后端·中间件·c#·asp.net·.netcore
猹叉叉(学习版)5 天前
【ASP.NET CORE】 7. Identity标识框架
笔记·后端·c#·asp.net·.netcore