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

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 "只有管理员才能访问";
        }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git应用(1)

一、Git Git(读音为/gɪt/。中文 饭桶 )是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 了解更多可到GIT官网&#xff1a;Git - Downloads GIT一般工作流程如下&#xff1a; 1&#xff0e;从远程仓库中克隆 Git 资源作为本地…

线程安全问题解析

线程内存模型 线程在工作的时候&#xff0c;如果涉及到需要访问对象的某个成员变量&#xff0c;比如下面的这个类里的amount 属性&#xff1a; class Goods {private int amount;// balabala.....} 线程在运行期间&#xff0c;首先把这个属性从主内存里load进自己的工作内存&…

leetcode:160. 相交链表

一、题目 原题链接&#xff1a;160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 二、思路 判断两个链表是否相交&#xff0c;只要判断两个链表是否有相同的…

图数据库Neo4j详解

文章目录 第一章 图和Neo4j1.1 图数据库概念1.1.1 图论起源1.1.2 节点-关系及图1.1.3 图数据库1.1.4 图数据库分类1.1.4 图数据库应用场景1.1.5 与关系型数据库对比1.1.6 图数据库优势 1.2 Neo4j介绍1.2.1 Neo4j是什么1.2.2 Neo4j特点1.2.3 Neo4j的优势1.2.4 Neo4j的限制1.2.5 …

揭秘系列: Goroutine调度器

现在不要担心理解上面的图片&#xff0c;因为我们将从非常基础的知识开始。 Goroutines分布在线程中&#xff0c;由Goroutine调度器在幕后处理。根据我们之前的讨论&#xff0c;我们知道一些关于Goroutines的事情&#xff1a; •从原始执行速度来看&#xff0c;Goroutines不一定…

Unity中全局光照GI的总结

文章目录 前言一、在编写Shader时&#xff0c;有一些隐蔽的Bug不会直接报错&#xff0c;我们需要编译一下让它显示出来&#xff0c;方便修改我们选择我们的Shader&#xff0c;点击编译并且展示编译后的Shader后的内容&#xff0c;隐蔽的Bug就会暴露出来了。 二、我们大概回顾一…

智慧畜牧小程序开发流程

本文将详细介绍智慧畜牧小程序的开发流程&#xff0c;包括需求分析、设计、开发、测试和上线等环节。同时&#xff0c;将深入思考智慧畜牧小程序的发展趋势和未来挑战&#xff0c;为读者提供有深度的思考和逻辑性的分析。 一、需求分析 1.明确目标用户&#xff1a;首先…

Bond配置文件配置

1、选择2个自己需要的网口&#xff0c;查看有哪些网口 [roothostname ~]# ifconfig -a [roothostname ~]#systemctl disable NetworkManager 开机不启动图形化网络服务 2、编辑网口的配置文件 [roothostname ~]# cd /etc/sysconfig/network-scripts [roothostname n…

实操创建属于自己的亚马逊云科技VPS服务:Amazon Lightsail

本文主要讲述如何独立创建自己的亚马逊云科技VPS服务&#xff0c;希望此文能帮助你对亚马逊云科技VPS服务也就是Amazon Lightsail&#xff0c;有个新的认识&#xff0c;对所使用的VPS有所帮助。 Amazon Lightsail是一款无论云计算的新手还是专家&#xff0c;都可通过其快速启动…

Sagemaker基础操作指南

简介 Amazon SageMaker是亚马逊AWS提供的一项托管式机器学习服务&#xff0c;旨在简化和加速机器学习开发的整个生命周期。它为机器学习工程师和数据科学家提供了一套完整的工具和功能&#xff0c;用于构建、训练、调优和部署机器学习模型。本文将会通过一个简单的例子&#x…

Conda executable is not found 三种问题解决

如果在PyCharm中配置Python解释器时显示“conda executable is not found”错误消息&#xff0c;这意味着PyCharm无法找到您的Conda可执行文件。您可以按照以下步骤解决此问题&#xff1a; 1.方法一 确认Conda已正确安装。请确保您已经正确安装了Anaconda或Miniconda&#xff…

演示文稿制作软件 Deckset mac中文版介绍

Deckset mac是一款Mac上的演示文稿制作软件&#xff0c;它可以让你使用Markdown语言快速地创建演示文稿。与传统的演示文稿制作软件相比&#xff0c;Deckset采用了全新的设计理念&#xff0c;旨在让用户更加专注于内容的创作&#xff0c;而不是花费过多的时间在排版和设计上。 …

vivo 数据库降本实践:探索成本效益最优的数据库解决方案

vivo 自 2022 年开始调研、测试 OceanBase 至今&#xff0c;现已上线 17 个业务系统&#xff0c;涵盖日志类、分析类、交易类业务&#xff0c;实现了总资源节省 80%&#xff0c;开发、运维工作大幅简化。vivo 体系与流程 IT 部门数据库高级工程师廖光明在本文中&#xff0c;详细…

Antd G6实现自定义工具栏

在使用g6实现知识图谱可视化中&#xff0c;产品经理提出了有关图谱操作的不少功能&#xff0c;需要放置在工具栏中&#xff0c;其中有些功能不在g6自带的功能里&#xff0c;且工具栏样式、交互效果也和官方自定义工具栏不同。那我们怎么去实现呢&#xff1f; g6官方的工具栏案例…

香港和美国节点服务器的测试IP哪里有?

在选择服务器时&#xff0c;我们通常需要进行一些测试来评估其性能和稳定性。当然&#xff0c;这其中一个重要的测试指标就是服务器的 IP 地址。通过测试 IP 地址&#xff0c;我们可以了解到服务器所在地区以及网络连接质量等信息。作为香港及亚太数据中心领先服务商恒创科技&a…

解决Python并发访问共享资源引起的竞态条件、死锁、饥饿问题的策略

目录 一、概述 二、竞态条件 三、死锁 四、饥饿 五、总结 一、概述 在Python中&#xff0c;多线程和多进程可以有效地提高程序的并发性能。然而&#xff0c;当多个线程或进程需要访问共享资源时&#xff0c;可能会引发竞态条件、死锁和饥饿等问题。这些问题可能会导致程序…

敏捷战略实施方法-资深组织发展专家实践秘笈

要怎样才能生成敏捷战略呢&#xff1f;作者基于多年的组织发展实践&#xff0c;总结出如下公式&#xff1a;敏捷战略 战略共创 迭代进化 即要得到一个好的敏捷战略&#xff0c;首先要做好战略共创&#xff0c;并在战略实施过程中对战略进行持续迭代&#xff0c;两者不可偏废…

机器学习——奇异值分解案例(图片压缩-代码简洁版)

本想大迈步进入前馈神经网络 但是…唉…瞅了几眼&#xff0c;头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作&#xff0c;会有一种浮在云端的虚无感 但是如果要实际操作&#xff0c;我又不想直接调用库包 可是…如果不直接调包&#xff0c;感…

一种优雅的调用第三方接口的思路及实现

之前的项目调用第三方接口时&#xff0c;往往用HttpUtils类似的静态方法调用。比较丑&#xff0c;不通用。如下&#xff0c;这是截取项目中某人调用的一段代码&#xff0c;非常不雅&#xff1a; 经改进后&#xff0c;采用了动态代理技术来实现&#xff0c;效果如下&#xff1a…

RabbitMQ的 五种工作模型

RabbitMQ 其实一共有六种工作模式&#xff1a; 简单模式&#xff08;Simple&#xff09;、工作队列模式&#xff08;Work Queue&#xff09;、 发布订阅模式&#xff08;Publish/Subscribe&#xff09;、路由模式&#xff08;Routing&#xff09;、通配符模式&#xff08;Topi…