asp.net core weapi 结合identity完成登录/注册/角色/权限分配

news2024/11/24 17:26:13

1.安装所需要的nuget包

    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.24" />
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.24" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.24" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.24">

2.注入sqlserver数据库服务完成identity数据库的迁移

  "ConnectionStrings": {
    "defaultsql": "server=.;uid=sa;pwd=peng@123;database=ide"
  }
     builder.Services.AddDbContext<IdentityDbContext>(p =>
            {
                p.UseSqlServer(builder.Configuration.GetConnectionString("defaultsql"), b => b.MigrationsAssembly("Log4NetTest"));
            });

3.在程序包管理控制台执行下面依次命令,完成用户权限管理表的迁移

add-migration init 
update-datebase

执行完后,数据库就多了下面的表
在这里插入图片描述
4.创建一个用户账号的类用于登录和注册

 public class account
    {
        public string usename { get; set; }
        public string password { get; set; }
    }

5.注入identity服务

 builder.Services.AddIdentity<IdentityUser, IdentityRole>()
    .AddEntityFrameworkStores<IdentityDbContext>();

6.注册

 private SignInManager<IdentityUser> _signInManager;
 private UserManager<IdentityUser> _userManager;
 public WeatherForecastController( SignInManager<IdentityUser> signInManager)
        {
            _signInManager = signInManager;
            _userManager = userManager;
        }
              /// <summary>
        /// 注册
        /// </summary>
        /// <param name="usename"></param>
        /// <param name="pwd"></param>
        [HttpPost]
        public async Task<string> Register(string usename, string pwd)
        {
            IdentityUser user = new IdentityUser()
            {
                UserName = usename
            };
            var result = await _userManager.CreateAsync(user, pwd);
            if (result.Succeeded)
            {
                return "添加成功";
            }
            return "失败";
        }

执行swagger查询数据库,添加了一条数据(表示注入成功)
在这里插入图片描述

6.登录

        /// <summary>
        ///
        /// 登录
        /// </summary>
        /// <param name="usename"></param>
        /// <param name="pwd"></param>
        [HttpPost]
        public async Task<string> Login(string usename, string pwd)
        {
            var user = await _userManager.FindByNameAsync(usename);
            if (user != null)
            {
                var re = await _signInManager.PasswordSignInAsync(user, pwd, false, false);
                if (re.Succeeded)
                {
                    return "登录成功";
                }
                return "登录失败";
            }
            return "登录失败";
        }

使用刚才注册的账号,在swagger中调用Login方法,返回登录成功。
补充:代码中使用了微软默认的策略,比如密码的长度限制和复杂度,尝试密码失败次数等。可以根据自己的需求进行更改

 builder.Services.Configure<IdentityOptions>(options =>
            {
                // 配置密码要求
                options.Password.RequireDigit = true;//数字
                options.Password.RequireLowercase = true;//小写字母
                options.Password.RequireUppercase = true;//大写字母
                options.Password.RequireNonAlphanumeric = true;//特殊字符
                options.Password.RequiredLength = 8;//密码长度

                // 配置用户锁定选项
                options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);//锁定时间
                options.Lockout.MaxFailedAccessAttempts = 5;//失败次数
                options.Lockout.AllowedForNewUsers = true;

                // 配置用户登录选项
                options.SignIn.RequireConfirmedEmail = false;
                options.SignIn.RequireConfirmedPhoneNumber = false;
            });

7.新增角色

  private RoleManager<IdentityRole> _roleManager;
  public WeatherForecastController(RoleManager<IdentityRole> roleManager)
        {
            _roleManager = roleManager;
        }
        
        /// <summary>
        /// 添加角色
        /// </summary>
        [HttpPost]
        public async Task<string> AddRole(string RoleName)
        {
            var rolename = await _roleManager.RoleExistsAsync(RoleName);
            if (rolename)
            {
                return "角色已经存在了";
            }
            IdentityRole role = new IdentityRole()
            {
                Name = RoleName,
            };
            var result = await _roleManager.CreateAsync(role);
            if (result.Succeeded)
            {
                return "添加成功";
            }
            else
            {
                return "添加失败";
            }
        }

8.获取所有角色

 /// <summary>
        /// 获取所有角色
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public List<IdentityRole> GetRoleList()
        {
            return _roleManager.Roles.ToList();
        }

9.给用户分配角色

 /// <summary>
        /// 给用户分配角色
        /// </summary>
        [HttpPost]
        public async Task<string> UserToRole(string userName, string roleName)
        {
            var user = await _userManager.FindByNameAsync(userName);
            if (user != null)
            {
                var IsExist = await _userManager.IsInRoleAsync(user, roleName);
                if (!IsExist)
                {
                    var result = await _userManager.AddToRoleAsync(user, roleName);

                    if (result.Succeeded)
                    {
                        return "分配成功";
                    }
                    else
                    {
                        return "分配失败";
                    }
                }
            }
            return "用户不存在";
        }

10.给角色授权(在program中添加策略)(使用策略)

  builder.Services.AddAuthorization(options =>
            {
                options.AddPolicy("RequireAdminRole", policy =>
                    policy.RequireRole("Admin"));
            });
             app.UseAuthentication();
            app.UseAuthorization();
        //只有登录用户并且管理员才能访问
        [HttpGet]
        [Authorize(Policy = "RequireAdminRole")]
        public string Print()
        {
            return "只有管理员才能访问";
        }

11.给角色授权(使用claim)

  builder.Services.AddAuthorization(options =>
            {
               options.AddPolicy("UserManager", policy =>
                {
                    policy.RequireClaim("用户管理", new string[] { "添加用户", "删除用户", "编辑用户" });
                });
            });
             app.UseAuthentication();
            app.UseAuthorization();

//给用户添加claim声明

          IdentityUser user = new IdentityUser()
            {
                UserName = usename
            };
            if (result.Succeeded)
            {
                await _userManager.AddClaimAsync(user, new Claim("用户管理", "添加用户"));
                return "添加成功";
            }
            return "失败";
   //只有登录用户并且用户claim包含了用户管理才能访问接口
        [HttpGet]
        [Authorize(Policy = "UserManager")]
        public string Print()
        {
            return "只有管理员才能访问";
        }

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

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

相关文章

Docker学习——⑥

文章目录 1、什么是存储卷?2、为什么需要存储卷?3、存储卷分类4、管理卷 Volume5、绑定卷 bind mount6、临时卷 tmpfs7、综合实战-MySQL 灾难恢复8、常见问题 1、什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立…

实战leetcode(二)

Practice makes perfect&#xff01; 实战一&#xff1a; 这里我们运用快慢指针的思想&#xff0c;我们的slow和fast都指向第一个节点&#xff0c;我们的快指针一次走两步&#xff0c;慢指针一次走一步&#xff0c;当我们的fast指针走到尾的时候&#xff0c;我们的慢指针正好…

FPGA UDP RGMII 千兆以太网(3)ODDR

1 xilinx原语 在 7 系列 FPGA 中实现 RGMII 接口需要借助 5 种原语,分别是:IDDR、ODDR、IDELAYE2、ODELAYE2(A7 中没有)、IDELAYCTRL。其中,IDDR和ODDR分别是输入和输出的双边沿寄存器,位于IOB中。IDELAYE2和ODELAYE2,分别用于控制 IO 口输入和输出延时。同时,IDELAYE2 …

使用切面实现前端重复提交(防抖)

使用切面实现前端重复提交&#xff08;防抖&#xff09; 代码结构定义注解请求锁切面处理器入参对象使用注解 代码结构 原理&#xff1a; 1、前端提交保存操作&#xff1b; 2、后端通过注解指定重复提交的关键字段进行识别&#xff0c;可以有多个&#xff1b; 3、拼接关键字段&…

科普测量开关电源输出波形的三种方法及电源波形自动化测试步骤

开关电源波形测试就是对开关电源的输出波形进行检测和分析&#xff0c;观察开关电源参数变化&#xff0c;以此来判断开关电源的性能是否符合要求。好的开关电源对于设备以及整个电路的正常运行是非常重要的&#xff0c;因此开关电源输出波形测试是开关电源测试的重要环节&#…

RK3399平台开发系列讲解(内存篇)free 命令查看内存占用情况介绍

🚀返回专栏总目录 文章目录 一、free的使用二、free的内容📢free 指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。 一、free的使用 -b  以 Byte 为单位显示内存使用情况。-k  以 KB 为单位显示内存使用情况。…

华为防火墙双机热备配置案例

思路&#xff1a; IP和路由、ospf要两台防火墙单配&#xff0c;hrp不会同步 其它zone和策略会同步&#xff0c;只在master上配就行了 FW_A主要配置&#xff1a; hrp enable hrp interface GigabitEthernet1/0/2 remote 172.16.0.2 interface GigabitEthernet1/0/0 undo shut…

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

Modbus 通信发送数据只能为 Int 类型&#xff0c;如下图所示&#xff1a; 可以发送 Int 和 Float 数据&#xff0c;如下图所示 通信设备配置如下&#xff1a; 发送事件配置如下&#xff1a; 通信管理界面显示有问题&#xff0c;显示为 Int 类型存在一定误导&#xff1b;可以…

【性能测试】服务端中间件docker常用命令解析整理(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、搜索 docker …

LeetCode(2)移除元素【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 27. 移除元素 1.题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原…

【机试题】LazyIterator迭代器懒加载问题

将下面这个未完成的Java工具类补充完成&#xff0c;实现懒加载的功能&#xff0c;该类需要实现Iterable接口&#xff0c;能够遍历所有数据。具体要求如下&#xff1a; 工具类提供了一个ValueLoader接口&#xff0c;用于获取数据&#xff0c;其中ValueLoader的接口定义为&#x…

Guitar Pro8.2中文版简谱制作工具

在音乐的大舞台上&#xff0c;谁不想成为一位吉他弹奏大师呢&#xff1f;但在现实中&#xff0c;学吉他并非一蹴而就&#xff0c;许多小伙伴都因为吉他的上手难度而被浇灭学习的热情。然而&#xff0c;这里有一款神奇的软件&#xff0c;叫做Guitar Pro&#xff0c;它就像是一把…

SDN和NFV笔记

目录 SDN SDN的引入 SDN的概念 SDN网络部署的方式 SDN架构 OpenFlow SDN与传统网络的区别 SDN的应用 SDN的优点 NFV NFV的概念&#xff1a; NFV的架构&#xff1a; NFV相比于传统物理网元&#xff1a; NFV与SDN的关系 NFV与SDN的相似点 NFV与SDN的不同 SDN SD…

EXPLAIN详解(MySQL)

EXPLAIN概述 EXPLAIN语句提供MySQL如何执行语句的信息。EXPLAIN与SELECT, DELETE, INSERT, REPLACE和UPDATE语句一起工作。 EXPLAIN返回SELECT语句中使用的每个表的一行信息。它按照MySQL在处理语句时读取表的顺序列出了输出中的表。MySQL使用嵌套循环连接方法解析所有连接。…

2022年12月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有n个按名称排序的商品,使用对分查找法搜索任何一商品,最多查找次数为5次,则n的值可能为?()(2分) A.5 B.15 C.30 D.35 答案:C 答案解析:对分查找最多查找次数m与个数之间n的…

高斯过程回归 | GPR高斯过程回归

高斯过程回归(Gaussian Process Regression, GPR)是一种强大的非参数回归方法,它通过假设数据是从一个高斯过程中生成的来预测新的数据点。 高斯过程是一种定义在连续输入空间上的随机过程,其中任何有限集合的观测值都呈多变量高斯分布。 实现GPR的Python代码import numpy …

Coding面试题之手写线程池

原理图 JDK线程池原理 实现代码 1.线程类&#xff08;PoolThread&#xff09; 这个类用于执行任务队列中的任务。 public class PoolThread extends Thread {private final Queue<Runnable> taskQueue;private boolean isStopped false;public PoolThread(Queue<…

Python---练习:求幸运数字6

案例&#xff1a; 幸运数字6&#xff08;只要是6的倍数&#xff09;&#xff1a;输入任意数字&#xff0c;如数字8&#xff0c;生成nums列表&#xff0c;元素值为1~8&#xff0c;从中选取幸运数字移动到新列表lucky&#xff0c;打印nums与lucky。 思考&#xff1a; 要求是6的…

说说 React中的setState执行机制

一、是什么 一个组件的显示形态可以由数据状态和外部参数所决定&#xff0c;而数据状态就是state 当需要修改里面的值的状态需要通过调用setState来改变&#xff0c;从而达到更新组件内部数据的作用 如下例子&#xff1a; import React, { Component } from react export d…

ARM 基础学习记录 / ARM 裸机编程

汇编程序调用 C 程序详情 在 C 程序和 ARM 汇编程序之间相互调用时必须遵守 ATPCS 规则&#xff0c;其是基于 ARM 指令集和 THUMB 指令集过程调用的规范&#xff0c;规定了调用函数如何传递参数&#xff0c;被调用函数如何获取参数&#xff0c;以何种方式传递函数返回值。 寄存…