惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
J
Java Code Geeks
V
V2EX
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
B
Blog
A
About on SuperTechFans
有赞技术团队
有赞技术团队
月光博客
月光博客
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
腾讯CDC
美团技术团队
大猫的无限游戏
大猫的无限游戏
爱范儿
爱范儿
N
Netflix TechBlog - Medium
C
Check Point Blog
Recent Announcements
Recent Announcements
博客园 - Franky
博客园 - 叶小钗
T
Tailwind CSS Blog

博客园 - uxinxin

.NET10 中配置Swagger的记录 .NET10中通过appsettings.json配置文件获取信息的几个方法 学习使用Taurus的微服务群在.NET Framework4.8环境下的搭建 .net framework 中Owin 通过启动类 Startup.cs 使用 SignalR B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【八】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【七】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【六】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【五】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【四】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【三】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【二】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 .NET程序屏蔽一些无效蜘蛛的访问配置 asp.net 动态加载与卸载程序集的尝试(没有成功)欢迎解决的朋友留言告知 Framework 4.6.2下的SignalR使用,以及WPF下同步使用 react 16.8.4版本中的生命周期中的细节 在组件挂在时使用了定时器的处理——尚硅谷React教程(2022加更,B站超火react教程)学习笔记 CYQ.Data的XML操作的一些自己使用记录 IIS URL Rewrite将伪静态配置文件放在web.config外部 一步步教你用html+div+css+js基于Jquery实现一套数字华容道游戏
ASP.NET Core EF MVC 登录验证
uxinxin · 2021-09-06 · via 博客园 - uxinxin

我也不是很懂,看视频学习,有如问题请指正!

根据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

本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。