我也不是很懂,看視頻學習,有如問題請指正!
根據ASP.NET Core MVC 登錄驗證_嗶哩嗶哩_bilibili視頻整理
創建項目
ASP.NET Core 5.0
Entity Framework 5.0
作者使用的是MSSQL,我換成了MYSQL
首先創建項目,作者使用了ASP.NET Core Web App(MVC)模板
我創建的ASP.NET Core Web空模板
通過NuGet安裝需要的插件引用
Microsoft.EntityFrameworkCore(5.0.9)
Microsoft.EntityFrameworkCore.Tools(5.0.9) 遷移相關操作需要的 實現Code First需要
Pomelo.EntityFrameworkCore.MySql(5.0.1) MySql 官方的都說不好使,我就用了這個社區的
創建User類
user.cs

using System.ComponentModel.DataAnnotations; namespace EF1.Domain.Entities { public class User { public int Id { get; set; } [Display(Name = "用戶名")] [MaxLength(20,ErrorMessage = "{0}長度不能大於{1}") ] public string Account { get; set; } public string Password { get; set; } } }
創建數據庫操作類
MyDbContext.cs

using Microsoft.EntityFrameworkCore; using EF1.Domain.Entities; namespace EF1.Domain { public class MyDbContext:DbContext { public DbSet<User> Users { get; set; } public MyDbContext(DbContextOptions options):base(options) { } } }
設置配置文件,新增鏈接數據庫字符串
appsettings.json

{ "ConnectionStrings": { "Default": "host=localhost;port=3306;database=EFCore1;uid=root;pwd=root" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
NetCore配置相關數據
Startup.cs

using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System; using EF1.Domain; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; namespace EF1 { public class Startup { public IConfiguration Configuration { get; } //創建構造函數注入Configuration配置項 public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { //設置Mysql版本號信息,代碼需要 var serverVersion = new MySqlServerVersion(new Version(5, 5, 23)); services.AddControllersWithViews();//根據自己需求配置是增加控制器和視圖,還是只增加控制器AddControllers services.AddDbContext<MyDbContext>(options => { options.UseMySql(Configuration.GetConnectionString("Default"), serverVersion); });//注冊MyDbContext服務 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/home/login"; });//權限驗證配置 } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); //登陸驗證 app.UseAuthentication(); //授權驗證 app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); }); } } }
授權驗證相關
對於需要授權的相關類或者方法增加[Authorize]驗證屬性訪問這些類或者方法就會觸發登陸驗證
當類設置有[Authorize]驗證屬性的,如果想給個別方法取消驗證可以給對應方法上增加[AllowAnonymous]屬性則不驗證該方法
登陸退出相關代碼

using System.Collections.Generic; using System.Security.Claims; using System.Threading.Tasks; using EF1.Domain; using EF1.Domain.Entities; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.EntityFrameworkCore; namespace EF1.Controllers { [Authorize] public class HomeController : Controller { private readonly MyDbContext _context; public HomeController(MyDbContext context) { _context = context; } public IActionResult Index() { return Json("Home/Index"+HttpContext.User.Identity.Name); } /// <summary> /// 登陸訪問頁 /// </summary> /// <param name="returnUrl"></param> /// <returns></returns> [AllowAnonymous] public IActionResult Login(string returnUrl) { ViewBag.returnUrl = returnUrl; return View(); } /// <summary> /// 登陸請求Post頁面 /// </summary> /// <param name="user"></param> /// <returns></returns> [AllowAnonymous] [HttpPost] public async Task<IActionResult> Login(UserLoginRequest user) { if (ModelState.IsValid)//模型數據驗證 { if (await _context.Users.AnyAsync(a => a.Account == user.Account && a.Password == user.Password))//登陸驗證 { var claims = new List<Claim> { new Claim(ClaimTypes.Name, user.Account) };//需要記錄存儲的數據,格式我也不會,死記硬背吧.. var claimnsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignInAsync(new ClaimsPrincipal(claimnsIdentity),new AuthenticationProperties{IsPersistent = true}); } else { return RedirectToAction(nameof(Login)); } } else { return UnprocessableEntity(ModelState); } return Redirect(user.ReturnUrl??"/"); } /// <summary> /// 退出請求頁面 /// </summary> /// <returns></returns> public async Task<IActionResult> LoginOut() { await HttpContext.SignOutAsync(); return RedirectToAction(nameof(Login)); } } public class UserLoginRequest:User { public string ReturnUrl { get; set; } } }