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 "只有管理员才能访问";
        }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面只是目标目录 ├─第1章-Shiro权限实战课程介绍 │ 1-1Shiro权限实战课程介绍.mp4 │ 1-2权限控制和初学JavaWeb处理访问权限控制.mp4 │ ├─第2章-大话权限框架核心知识ACL和RBAC │ 2-1权限框架设计之ACL和RBAC讲解.mp4 │ 2-2主流权限框架介绍和技术选型讲解.mp4 │ ├─第3章-ApacheShiro基础概念知识和架构讲解 │ 3-1Shiro核心知识之架构图交互和四大模块讲解.mp4 │ 3-2用户访问Shrio权限控制运行流程和常见概念讲解.mp4 │ ├─第4章-Springboot2.x整合ApacheShiro快速上手实战 │ 4-1SpringBoot2.x整合Shiro.mp4 │ 4-2快速上手之Shiro认证和授权流程实操上集.mp4 │ 4-3Shiro认证和授权流程和常用API梳理下集.mp4 │ ├─第5章-详细讲解ApacheShirorealm实战 │ 5-1Shiro安全数据来源之Realm讲解.mp4 │ 5-2快速上手之Shiro内置IniRealm实操.mp4 │ 5-3快速上手之Shiro内置JdbcRealm实操.mp4 │ 5-4ApacheShiro自定义Readl实战.mp4 │ 5-5深入Shiro源码解读认证授权流程.mp4 │ ├─第6章-Shiro权限认证Web案例知识点讲解 │ 6-1Shiro内置的Filter过滤器讲解.mp4 │ 6-2Shiro的Filter配置路径讲解.mp4 │ 6-3Shiro数据安全之数据加解密.mp4 │ 6-4Shiro权限控制注解和编程方式讲解.mp4 │ 6-5Shiro缓存模块讲解.mp4 │ 6-6ShiroSession模块讲解.mp4 │ ├─第7章-ApacheShiro整合SpringBoot2.x综合案例实战 │ 7-10使用ShiroLogout和加密处理.mp4 │ 7-1Shiro整合SpringBoot2.x案例实战介绍.mp4 │ 7-2基于RBAC权限控制实战之Mysql数据库设计.mp4 │ 7-3SpringBoot2.x项目框架和依赖搭建.mp4 │ 7-4案例实战之权限相关服务接口开发.mp4 │ 7-5案例实战之用户角色权限多对多关联查询SQL.mp4 │ 7-6案例实战自定义CustomRealm实战.mp4 │ 7-7项目实战之ShiroFilterFactoryBean配置实战.mp4 │ 7-8前后端分离自定义SessionManager验证.mp4 │ 7-9API权限拦截验证实战.mp4 │ ├─第8章-权限控制综合案例实战进阶 │ 8-1实战进阶之自定义ShiroFilter过滤器上集.mp4 │ 8-2实战进阶之自定义ShiroFilter过滤器下集.mp4 │ 8-3性能提升之Redis整合CacheManager.mp4 │ 8-4性能提升之Redis整合SessionManager.mp4 │ 8-5ShiroConfig常用bean类配置.mp4 │ ├─第9章-大话分布式应用的鉴权方式 │ 9-1单体应用到分布式应用下的鉴权方式介绍.mp4 │ 9-2Shiro整合SpringBoot下自定义SessionId.mp4 │ ├─第10章-Shiro课程总结 │ 10-1Apacheshiro从入门到高级实战课程总结.mp4 │ 10-2高级工程师到架构师-解决问题思路+学习方法.mp4 │ └─课件资料.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值