ASP.NET Core EF MVC 登錄驗證


我也不是很懂,看視頻學習,有如問題請指正!

根據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; }
    }
}
View Code

創建數據庫操作類

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)
        {
            
        }
    }
}
View Code

設置配置文件,新增鏈接數據庫字符串

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": "*"
}
View Code

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();
            });
        }
    }
}
View Code

授權驗證相關

對於需要授權的相關類或者方法增加[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; }
    }
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM