做购物网站适合的服务器网站建设需求模版

news/2025/10/7 8:01:19/文章来源:
做购物网站适合的服务器,网站建设需求模版,企业网站手机版,网站设计公司深目录 前言 一、创建上下文类 1.自定义MyContext上下文类继承IdentityDbContext 2.在Program中添加AddDbContext服务 二、使用Migration数据迁移 1.在控制台中 依次使用add-migration 、updatebase 命令 2.如何修改表名 3.如何自定义字段 三、使用Identity实现登录、修改密码 … 目录 前言 一、创建上下文类 1.自定义MyContext上下文类继承IdentityDbContext 2.在Program中添加AddDbContext服务 二、使用Migration数据迁移 1.在控制台中 依次使用add-migration 、updatebase 命令  2.如何修改表名  3.如何自定义字段 三、使用Identity实现登录、修改密码 1.在Program中 添加AddIdentityCore服务、AddRoleManager、AddUserManager配置 2.在控制器注入UserManager、RoleManager服务 四、使用JWT实现权限验证 1.在启动类Program.cs中配置Swagger可以输入身份验证方式 2.配置类信息、AddAuthentication服务 3.在登录的接口中返回token 4.在需要鉴权的接口加上 [Authorize] 总结 前言 identity ASP.NET Core提供了标识identity框架它采用RBACrole-based access control基于角色的访问控制策略内置了对用户、角色等表的管理及相关的接口从而简化了系统的开发。 CodeFirst 先创建实体类再通过实体类反向的创建数据库和表结构 什么是JWT JSON WEB Token是一种基于JSON的、用于在网络上声明某种主张的令牌token JWT组成 JWT通常由三部分组成: 头信息header, 消息体payload和签名signature 头信息指定了该JWT使用的签名算法HS256 表示使用了 HMAC-SHA256 来生成签名。 消息体包含了JWT的意图 未签名的令牌由base64url编码的头信息和消息体拼接而成使用.分隔签名则通过私有的key计算而成。 最后在未签名的令牌尾部拼接上base64url编码的签名同样使用.分隔就是JWT了 典型的JWT的格式xxxxx.yyyyy.zzzzz 一、创建上下文类 安装Microsoft.EntityFrameworkCore 安装Microsoft.AspNetCore.Identity.EntityFrameworkCore  1.自定义MyContext上下文类继承IdentityDbContext 示例如下 public class MyContext : IdentityDbContext{public MyContext(DbContextOptionsMyContext options) : base(options){}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder); }}2.在Program中添加AddDbContext服务 安装Microsoft.EntityFrameworkCore.SqlServer  示例如下 builder.Services.AddDbContextMyContext(options {var connectionStr builder.Configuration.GetConnectionString(SqlServer:Connection);options.UseSqlServer(connectionStr); });在配置文件中appsettings.json配置连接字符串 ConnectionStrings: {sqlserver: {Connection: Server服务器名称;User Id账号;Password密码;Database数据库;MultipleActiveResultSetstrue;EncryptTrue;TrustServerCertificateTrue;}} 二、使用Migration数据迁移 安装Microsoft.EntityFrameworkCore.Tools  1.在控制台中 依次使用add-migration 、updatebase 命令  如图所示 执行成功后 去数据库看数据库已经建立好了 效果如下 2.如何修改表名  生成的表都默认是带有AspNet 觉得不喜欢那怎么修改呢 使用 FluentAPI配置 示例如下 public class UserConfig : IEntityTypeConfigurationIdentityUser{public void Configure(EntityTypeBuilderIdentityUser builder){builder.ToTable(User);}}public class RoleConfig : IEntityTypeConfigurationIdentityRole{public void Configure(EntityTypeBuilderIdentityRole builder){builder.ToTable(Role);}}public class UserRoleConfig : IEntityTypeConfigurationIdentityUserRolestring{public void Configure(EntityTypeBuilderIdentityUserRolestring builder){builder.ToTable(UserRole);}} 在OnModelCreating方法中加入 // 反射中找项目下所有 继承IEntityTypeConfiguration的配置modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly); 再次执行add-migration 、updatebata 命令  再去数据库查看 已经成功修改我们想要的表名了 3.如何自定义字段 比如我想在用户表中添加年龄字段创建新的用户类去继承IdentityUser类 示例如下 public class User: IdentityUser{/// summary/// 年龄/// /summarypublic int? Age { get; set; }/// summary/// 备注/// /summarypublic string ReMark { get; set; }} 在UserConfig类中修改成User public class UserConfig : IEntityTypeConfigurationUser{public void Configure(EntityTypeBuilderUser builder){builder.Property(x x.Id).HasColumnOrder(1);//字段排序builder.Property(x x.Age).IsRequired(false); //可以为空builder.Property(x x.ReMark).HasMaxLength(200).IsRequired(false); //指定长度 ,可以为空builder.ToTable(User);}} 注意上下文MyContext:IdentityDbContext需要修改成MyContext:IdentityDbContextUser 这时候 再去执行migration命令再去看数据库已经加上了 效果如下  三、使用Identity实现登录、修改密码 1.在Program中 添加AddIdentityCore服务、AddRoleManager、AddUserManager配置 示例如下  builder.Services.AddIdentityCoreUser(options {//配置用户名options.User new UserOptions{RequireUniqueEmail false, //要求Email唯一//AllowedUserNameCharacters abcdefgABCDEFG123456789 //允许的用户名字符默认是 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._};//配置密码options.Password new PasswordOptions{RequiredLength 6, //要求密码最小长度默认是 6 个字符RequireDigit true, //要求有数字RequiredUniqueChars 1, //要求至少要出现的字母数RequireLowercase false, //要求小写字母RequireNonAlphanumeric false, //要求特殊字符RequireUppercase false //要求大写字母};//锁定账户options.Lockout new LockoutOptions{AllowedForNewUsers true, // 新用户锁定账户DefaultLockoutTimeSpan TimeSpan.FromMinutes(1), //锁定时长默认是 5 分钟MaxFailedAccessAttempts 3 //登录错误最大尝试次数默认 5 次};//令牌配置//打开此 设置 为 短验证码 不打开为 长验证码options.Tokens.PasswordResetTokenProvider TokenOptions.DefaultEmailProvider;options.Tokens.EmailConfirmationTokenProvider TokenOptions.DefaultEmailProvider;}); var idBuilder new IdentityBuilder(typeof(User), typeof(IdentityRole), builder.Services); idBuilder.AddEntityFrameworkStoresMyContext().AddDefaultTokenProviders().AddRoleManagerRoleManagerIdentityRole().AddUserManagerUserManagerUser();2.在控制器注入UserManager、RoleManager服务 示例如下  [ApiController][Route([controller]/[action])]public class UserController : ControllerBase{private readonly UserManagerUser _userManager;public UserController(UserManagerUser userManager){_userManager userManager;}/// summary/// 创建用户/// /summary/// returns/returns[HttpPost]public async TaskIActionResult CreateUser(LoginRequest loginRequest){ User user await _userManager.FindByNameAsync(loginRequest.UserName);if (user null){user new User{UserName loginRequest.UserName};var result await _userManager.CreateAsync(user, loginRequest.Password);if (!result.Succeeded){return BadRequest(result.Errors);} }return Ok();}/// summary/// 登录/// /summary/// param nameloginRequest/param/// returns/returns[HttpPost]public async TaskIActionResult Login(LoginRequest loginRequest){string userName loginRequest.UserName;string password loginRequest.Password;var user await _userManager.FindByNameAsync(userName);if (user null){return NotFound($用户名{userName}不存在!);}var islocked await _userManager.IsLockedOutAsync(user);if (islocked){return BadRequest(用户已锁定);}var success await _userManager.CheckPasswordAsync(user, password);if (success){return Ok();}else{var r await _userManager.AccessFailedAsync(user);if (!r.Succeeded){return BadRequest(访问失败信息写入错误);}else{return BadRequest(失败);}}}/// summary/// 修改密码/// /summary/// param namereq/param/// returns/returns[HttpPost]public async TaskIActionResult ChangePassword(ChangePasswordRequest req){ var user await _userManager.FindByNameAsync(req.UserName);if (user null){return NotFound($用户名{req.UserName}不存在!);}var result await _userManager.ChangePasswordAsync(user,req.oldPassword,req.newPassWord);if (!result.Succeeded){return BadRequest(修改失败);}return Ok(Success);}#region 通过发送邮箱的方式重置密码/// summary/// 重置密码发送Token/// /summary/// param namereq/param/// returns/returns[HttpPost]public async TaskIActionResult SendResetPasswordToken(SendResetPasswordTokenRequest req){string email req.Email;var user await _userManager.FindByEmailAsync(email);if (user null){return NotFound($邮箱不存在{email});}string token await _userManager.GeneratePasswordResetTokenAsync(user);return Ok($向邮箱{user.Email}发送Token{token});}/// summary/// 重置密码/// /summary/// param namereq/param/// returns/returns[HttpPost]public async TaskIActionResult ResetPasswordToken(ResetPasswordRequest req){string userName req.UserName;var user await _userManager.FindByNameAsync(userName);if (user null){return NotFound($用户名{userName}不存在!);}var islocked await _userManager.IsLockedOutAsync(user);if (islocked){return BadRequest(用户已锁定);}var result await _userManager.ResetPasswordAsync(user, req.token,req.newPassWord);if (!result.Succeeded){return BadRequest(修改失败);}return Ok(Success);}#endregion}public record LoginRequest(string UserName, string Password);public record ChangePasswordRequest(string UserName, string oldPassword,string newPassWord);public record SendResetPasswordTokenRequest(string Email);public record ResetPasswordRequest(string UserName, string token,string newPassWord); 四、使用JWT实现权限验证 安装Microsoft.AspNetCore.Authentication.JwtBearer 1.在启动类Program.cs中配置Swagger可以输入身份验证方式 示例如下  builder.Services.AddSwaggerGen(options {options.AddSecurityDefinition(Bearer, new OpenApiSecurityScheme{Description 请输入token,格式为 Bearer xxxxxxxx注意中间必须有空格,Name Authorization,//jwt默认的参数名称In ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中)Type SecuritySchemeType.ApiKey,BearerFormat JWT,Scheme Bearer});//添加安全要求options.AddSecurityRequirement(new OpenApiSecurityRequirement {{new OpenApiSecurityScheme{Reference new OpenApiReference{Type ReferenceType.SecurityScheme,Id Bearer}},new string[]{ }}});}); 2.配置类信息、AddAuthentication服务 示例如下 public class JWTOptions{/// summary/// 颁发者 /// /summarypublic string Issuer { get; set; }/// summary/// 接收者 /// /summarypublic string Audience { get; set; } /// summary/// 密钥/// /summarypublic string SigningKey { get; set; }/// summary/// 过期时间/// /summarypublic int ExpireSeconds { get; set; }} 在配置文件appsettings.json中加入以下信息 JWT: {Issuer: 我是小小鱼,Audience: 我是小小鱼,SigningKey: fasdfad9045dafz222#fadpio0232,ExpireSeconds: 3600} 在添加AddAuthentication服务 builder.Services.ConfigureJWTOptions(builder.Configuration.GetSection(JWT)); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(x {var jwtOpt builder.Configuration.GetSection(JWT).GetJWTOptions();byte[] keyBytes Encoding.UTF8.GetBytes(jwtOpt.SigningKey);var secKey new SymmetricSecurityKey(keyBytes);x.TokenValidationParameters new(){ValidateIssuer true,//是否验证IssuerValidateAudience true,//是否验证AudienceValidateIssuerSigningKey true,//是否验证SecurityKeyValidIssuer jwtOpt.Issuer,ValidAudiencejwtOpt.Audience,IssuerSigningKey secKey,ValidateLifetime true, //是否验证失效时间ClockSkew TimeSpan.FromSeconds(4)}; }); 创建一个Jwt辅助类 public class JwtHelper{public static string BuildToken(IEnumerableClaim claims, JWTOptions options){DateTime expires DateTime.Now.AddSeconds(options.ExpireSeconds);byte[] keyBytes Encoding.UTF8.GetBytes(options.SigningKey);var secKey new SymmetricSecurityKey(keyBytes);var credentials new SigningCredentials(secKey,SecurityAlgorithms.HmacSha256Signature);var tokenDescriptor new JwtSecurityToken(options.Issuer,options.Audience,expires: expires,signingCredentials: credentials, claims: claims);return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);}} 3.在登录的接口中返回token 示例如下 /// summary/// 登录/// /summary/// param nameloginRequest/param/// returns/returns[HttpPost]public async TaskIActionResult Login(LoginRequest loginRequest,[FromServices] IOptionsJWTOptions jwtOptions){string userName loginRequest.UserName;string password loginRequest.Password;var user await _userManager.FindByNameAsync(userName);if (user null){return NotFound($用户名{userName}不存在!);}var islocked await _userManager.IsLockedOutAsync(user);if (islocked){return BadRequest(用户已锁定);}var success await _userManager.CheckPasswordAsync(user, password);if (success){var claims new ListClaim();claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()));claims.Add(new Claim(ClaimTypes.Name, user.UserName));var roles await _userManager.GetRolesAsync(user);foreach (string role in roles){claims.Add(new Claim(ClaimTypes.Role, role));}string Token JwtHelper.BuildToken(claims, jwtOptions.Value);return Ok(Token);}else{var r await _userManager.AccessFailedAsync(user);if (!r.Succeeded){return BadRequest(访问失败信息写入错误);}else{return BadRequest(失败);}}} 效果如下 4.在需要鉴权的接口加上 [Authorize] 示例如下 /// summary/// 获取用户信息/// /summary/// returns/returns[HttpPost][Authorize]public async TaskIActionResult GetUser() {var claimsPrincipal this.HttpContext.User;var name claimsPrincipal.Claims.FirstOrDefault(r r.Type http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name)?.Value;var user await _userManager.FindByNameAsync(name);if (user null){return BadRequest(token有误);}return Ok($获取用户名{user.UserName},邮箱{user.Email});}运行效果 总结 以上简单用Identity框架在通过migration命令建库建表再使用 FluentAPI配置表名、字段,用dentity框架封装的UserManager实现登录、修改密码以及通过token实现鉴权

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于路由使用的ref的疑问

<script setup>import { ref, computed } from vueimport Home from ./Home.vueimport About from ./About.vueimport NotFound from ./NotFound.vueconst routes = { /: Home, /about: About}const currentPa…

天津到天津天津网站开发iis v6 新建网站

大数据管理数据处理过程图大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察力。大数据处理的主要流程包括数据收集、数据存储、数据处理、数据应用等主要环节。随着业务的增长,大量和流程、规…

自建购物网站福建响应式网站制作

目录 详细布置&#xff1a; 1. 层序遍历 2. 226. 翻转二叉树 3. 101. 对称二叉树 详细布置&#xff1a; 1. 层序遍历 昨天练习了几种二叉树的深度优先遍历&#xff0c;包括&#xff1a; ​​​​​​前中后序的递归法前中后序的迭代法前中后序迭代的统一写法 今天&…

扁平化企业网站从零开始制作wordpress主题

文章目录 360篡改浏览器主页方法1锁定浏览器主页 方法2注册表修改 360广告和弹窗360极速版 小结 360篡改浏览器主页 如果您使用360,且不想卸载它,那么当你启动360后,它可能会篡改你的浏览器(比如edge)的主页start page为360早期可能是通过修改快捷方式的target等属性,但是现在…

新网站建设验收公司手机网站模板

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

公司专业网站建设百度分享代码 wordpress

背景&#xff1a; 想知道四川省包含哪些水系&#xff0c;以及各个水系的分布&#xff0c;起点、流经省市、终点等 {label: "嘉陵江",value: "嘉陵江",},{label: "渠江",value: "渠江",},{label: "涪江",value: "涪江&q…

Paypal 设置不自动换汇

进入 PayPal 网页版自动付款设置。选择结算商户,查看兑换选项,修改为使用银行的兑换方式。

网站建设培训赚钱吗怎么才能在百度上做引流呢

目录 引出Redis持久化方式Redis入门1.Redis是什么&#xff1f;2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户注册验证码4.R…

威县网站建设报价微信app开发价格表

我们需要将Python对象序列化为字节流&#xff0c;这样就可以将其保存到文件中、存储到数据库中或者通过网络连接进行传输。 解决方案 序列化最普遍的做法是使用 pickle 模块。为了将一个对象保存到一个文件中&#xff0c;可以这样做&#xff1a; import pickledata ... # Some…

国外网站参考住房城乡与建设厅网站首页

压缩方式是网络视频服务器和网络摄像机的核心技术&#xff0c;压缩方式很大程度上决定着图像的质量、压缩比、传输效率、传输速度等性能&#xff0c;它是评价网络视频服务器和网络摄像机性能优劣的重要一环。 随着多媒体技术的发展&#xff0c;相继推出了许多压缩编码标准&…

中博建设集团有限公司网站湖南软件开发公司

前言 由于兼容性问题&#xff0c;使得我们若想用较新版本的 PyTorch&#xff0c;通过 GPU 方式训练模型&#xff0c;也得更换较新版本得 CUDA 工具包。然而 CUDA 的版本又与电脑显卡的驱动程序版本关联&#xff0c;如果是低版本的显卡驱动程序安装 CUDA11 及以上肯定会失败。 比…

wordpress圆角插件汉化青岛网络优化推广公司

C#流和文件 文件及文件夹管理 WinForm中的文件对话框 文件内容的读写 注册表操作

手机网站前端电商法规定企业网站必须做3年

1. 业务理解与需求分析 业务场景梳理&#xff1a;深入理解业务流程、业务规则、用户行为模式等&#xff0c;明确系统需要支持的核心功能和应用场景。非功能性需求识别&#xff1a;关注性能指标&#xff08;如响应时间、并发处理能力、数据吞吐量等&#xff09;、可用性要求&am…

诺贝尔生理与医学奖颁给这项革命技术,多家中国公司已布局!(附名单)

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 刚刚,2025年诺贝尔生理学或医学奖震撼公布。科学家玛丽E布伦科(…

网站上传好了如何做定向wordpress用户注册代码修改哪里

数据驱动将测试数据和测试行为完全分离&#xff0c;实施数据驱动测试步骤如下&#xff1a; A、编写测试脚本&#xff0c;脚本需要支持从程序对象、文件或者数据库读入测试数据&#xff1b; B、将测试脚本使用的测试数据存入程序对象、文件或者数据库等外部介质中&#xff1b;…

服务好的南京网站建设搜索引擎营销方案例子

使用ws自动创建的vitevue3项目后设置不了alias 答&#xff1a;不懂原理&#xff0c;但是有其他方法解决。直接在命令行执行“npm init vitelatest"后&#xff0c;一路选下去有create-vue的选项&#xff0c;就选这个create-vue创建&#xff1b;创建后会自动导入一个叫node…

钱璐璐,唯一通讯发Nature,作者仅2人!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087在人工分子机器领域,寻找一种像ATP或电力那样通用的能源一直是一个…

公司网站怎么选网站改了title 删除百度就的收录

什么是DCS DCS&#xff0c;即分散控制系统&#xff0c;是一种用于监控和控制工业过程的系统。它通过连接多个控制器、传感器和执行器实现自动化控制&#xff0c;提高生产效率和安全性。在中国&#xff0c;随着工业化和自动化水平的提高&#xff0c;DCS技术得到了广泛应用和快速…

手机怎么上wap网站网站编辑怎么做的

规定word导入格式 1、[单选题][2024][一般]题目1 A.选项1 B.选项2 C.选项3 D.选项4 答案&#xff1a;D 试题图片&#xff08;上传多媒体图片&#xff09;&#xff1a; 分数&#xff1a;2 答案解析&#xff1a; 2、[多选题][2024][困难]题目2 A.选项1 B.选项2 C.选项3 D.选项4 E…

安徽网站建站系统哪家好wordpress单栏简洁

本软件仅供学习交流&#xff0c;完全免费&#xff0c;同时也为帮助有缘人能买到自用的口罩&#xff0c;度过这段特殊时期&#xff01;请勿用于其它用途&#xff0c;谢谢&#xff01;如有违规&#xff0c;请删帖&#xff01;下载地址&#xff1a;https://www.lanzous.com/ia3bfl…