.Net中的标识框架Identity

news/2024/9/12 18:20:06/

中间件:

1、Authentication对访问者的用户身份进行验证,“用户是否登录成功”。

2、Authorization验证访问者的用户身份是否有对资源访问的访问权限,“用户是否有权限访问这个地址”。

简单描述

1、标识(Identity)框架:采用基于角色的访问控制(Role-Based Access Control,简称RBAC)策略,内置了对用户、角色等表的管理以及相关的接口,支持外部登录、2FA等。它允许我们创建、读取、更新和删除账户。支持账号验证、身份验证、授权、恢复密码和SMS双因子身份验证。它还支持微软、Facebook和Google等第三方登录提供商。它提供了一个丰富的API,并且这些API还可以进行大量的扩展。我们将在本书的后面实现这些功能。

2、标识框架使用EF Core对数据库进行操作,因此标识框架支持几乎所有数据库。

使用场景

涉及注册、登录和修改密码等功能,登录系统后,有些功能会提示没有权限,甚至有些位置我们无法访问,这些都是系统权限和认证的体现。

配置Identity

安装Nuget

Microsoft.AspNetCore.Identity.EntityFrameworkCore

创建Identity上下文对象

public class MyContext:IdentityDbContext<User,Role,long>

{

    public MyContext(DbContextOptions<MyContext> options)

    : base(options)

    {

    }

 

    protected override void OnModelCreating(ModelBuilder builder)

    {

        base.OnModelCreating(builder);

        builder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);

    }

}

如果需要对User(用户)和Role(角色)进行扩展可进行继承

public class Role:IdentityRole<long> //泛型类型longId类型

{

}

 

public class User:IdentityUser<long>

{

    public DateTime CreationTime { get; set; } //创建时间

    public string? NickName { get; set; }   //昵称

}

向依赖注入容器中注册标识框架相关的服务

builder.Services.AddDataProtection();

//注意不是AddIdentity

builder.Services.AddIdentityCore<User>(options => {   

    options.Password.RequireDigit = false;//设置密码是否必须是数字

    options.Password.RequireLowercase = false;//是否必须小写

    options.Password.RequireNonAlphanumeric = false;//是否必须非数字

    options.Password.RequireUppercase = false;//是否必须大写

    options.Password.RequiredLength = 6;//长度为6

    options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultProvider;//设置密码令牌

    options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;//设置邮箱令牌

});

var idBuilder = new IdentityBuilder(typeof(User), typeof(Role), builder.Services);

idBuilder.AddEntityFrameworkStores<MyContext>()

    .AddDefaultTokenProviders().AddRoleManager<RoleManager<Role>>()

    .AddUserManager<UserManager<User>>();

执行Add-Migration、Update-Database等命令执行EF Core的数据库迁移。

Add-Migration Init

Update-Database

创建角色与用户信息

[Route("api/[controller]/[action]")]

[ApiController]

public class IdentityController : ControllerBase

{

//通过RoleManager、UserManager等来进行数据操作。比如创建角色、创建用户。

    private readonly RoleManager<Role> roleManager;

    private readonly UserManager<User> userManager;

    public IdentityController(RoleManager<Role> roleManager, UserManager<User> userManager)

    {

        this.roleManager = roleManager;

        this.userManager = userManager;

    }

 

    [HttpPost]

    public async Task<ActionResult> CreateUserRole()

    {

        bool roleExists = await roleManager.RoleExistsAsync("admin");//判断是否存在这个角色

        if (!roleExists)

        {

            Role role = new Role { Name = "Admin" };

            var r = await roleManager.CreateAsync(role);

            //创建失败返回错误信息

            if (!r.Succeeded)

            {

                return BadRequest(r.Errors);

            }

        }

 

        User user = await this.userManager.FindByNameAsync("rodio");//获取某用户信息

        if (user == null)

        {

            user = new User {

           UserName = "rodio",

           Email = "abc123888@gmail.com",

               EmailConfirmed = true

            };

            var r = await userManager.CreateAsync(user, "123456");

            //创建用户信息失败返回错误信息

            if (!r.Succeeded)

            {

                return BadRequest(r.Errors);

            }

            //将角色和用户进行关联

            r = await userManager.AddToRoleAsync(user, "admin");

            if (!r.Succeeded)

            {

                return BadRequest(r.Errors);

            }

        }

        return Ok();

    }

}

 

用户登录

//用户登录类

public record LoginRequest(string UserName,string Password);

//控制器添加一个Action

[HttpPost]

public async Task<ActionResult> Login(LoginRequest req)

{

    string userName = req.UserName;

    string password = req.Password;

    var user = await userManager.FindByNameAsync(userName);//获取某用户信息

    if (user == null)//判断是否存在

    {

        return NotFound($"用户名不存在{userName}");

    }

    //判断该用户是否被锁(封号)

    if (await userManager.IsLockedOutAsync(user))

    {

        return BadRequest("LockedOut");

    }

    //判断用户的账号密码是否成功

    var success = await userManager.CheckPasswordAsync(user, password);

    if (success)

    {

        return Ok("Success");

    }

    else

    {

        //将用户的登录失败进行计数。如果超过配置次数将会被锁(封号)

        var r = await userManager.AccessFailedAsync(user);

        if (!r.Succeeded)

        {

            return BadRequest("AccessFailed failed");

        }

        return BadRequest("Failed");

    }

}

 


http://www.ppmy.cn/news/48018.html

相关文章

轻松掌握K8S使用kubectl操作配置文件挂载ConfigMap和密钥Secret知识点05

1、挂载应用配置文件配置集ConfigMap 当有许多应用如redis、mysql&#xff0c;希望将它的配置文件挂载出去&#xff0c;以便随时修改&#xff0c;可以用ConfigMap配置集 具体用法查看使用命令行操作里的 3、ConfigMap配置集实战 2、挂载应用配置文件的敏感信息Secret Secre…

Linux 系统调用深思:从原理到实战

Linux 系统调用揭秘&#xff1a;从原理到实战&#xff08;Demystifying Linux System Calls: From Principles to Practice&#xff09; 引言&#xff08;Introduction&#xff09;系统调用的概念&#xff08;Concept of System Calls&#xff09;Linux操作系统与系统调用的关系…

使用element-plus组件,修改date-picker默认样式

使用深度选择器来修改子组件的样式&#xff0c;今天遇到一个需求&#xff0c;在el-drawer中嵌入的el-date-picker&#xff0c;再一次总结一下深度选择器的用法&#xff0c;需求如下&#xff1a; template内容&#xff1a; <el-drawer size"70%" v-model"dr…

Golang微服务一把嗦 用户微服务集成主流最新go技术栈

声明&#xff1a;此文章为博主个人学习记录&#xff0c;仅供学习和交流&#xff0c;如有侵权请联系博主。 前言 前段时间&#xff0c;因为本地k8s环境一直出问题&#xff0c;线上云环境也用不起&#xff0c;&#xff08;后面搞定了再慢慢学习&#xff09;所以就暂时搁置了k8s学…

【C/C++】GDB 快速定位虚函数表并获取详情信息

文章目录 在GDB中&#xff0c;可以使用以下命令来查看虚函数表&#xff1a; 首先&#xff0c;使用GDB调试程序&#xff0c;并在程序运行到需要查看虚函数表的地方停下来。 然后&#xff0c;使用命令“p /x (long)object”来查看对象的地址。这个命令会输出对象的地址&#xff…

DHCP原理与配置

目录 一、DHCP工作原理 1&#xff09;了解DHCP服务 使用DHCP的好处 DHCP的分配方式 2&#xff09;DHCP的租约过程 分为四个步骤 二、DHCP服务器的配置 1&#xff09;检查并且安装dhcp有关软件包 2&#xff09;查看系统的配置文件&#xff0c;并且利用好官方给的参考案…

一起学 Java(三) 集合框架、数据结构、泛型

一、Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容&#xff1a; 接口&#xff1a;是代表集合的抽象数据类型。接口允许集合独立操纵其代表的细节。在面向对象的语言&#xff0c;接口通常形成一个层次。实现&#xff08;类&#x…

注册功能编写--购物车拓展

教程给出的模板在登录板块的功能不够齐全&#xff0c;正常情况下我们还应该有一个注册功能。所以这次我来写一个注册功能。 1、给登录的jsp页面添加相关超链接按钮&#xff0c;顺便把页面内容通过css改一改。然后再写一个负责注册的jsp 2、在userdao中再写一个方法负责给user表…

leetcode刷题--辅助工具

idea插件 插件商店搜索leetcode&#xff0c;可以让你利用idea调试leetcode的题目 插件首先需要填写用户名密码登录&#xff0c;登录上就可以在idea搜题、做题、提交等 注意&#xff1a; 一些版本登录可能登录失败&#xff0c;解决方法是换leetcode地址为leetcode.cn。 有些可…

灵活可扩展,2023年值得尝试的13款富文本编辑器

作为前端开发人员&#xff0c;我们经常需要为网站和应用程序添加文本内容。与传统的文本编辑器不同&#xff0c;富文本编辑器可让您轻松创建各种类型的文本内容&#xff0c;包括加粗字体、斜体字、框架、列表、图片和视频等。 本文我将向大家推荐 13 款开源的灵活可拓展的富文…

前端研发提质增效利器,TypeScirpt成功迁移详解

点击蓝字&#x1f446; 关注Agilean&#xff0c;获取一手干货 直播预告&#xff1a;Adapt 系列直播又双叒叕来啦&#xff01;最新一期我们将围绕「版本分支与环境」进行深入探讨&#xff0c;欢迎大家来直播间和主播互动哟&#xff5e; 点击下方右上角红色按钮「预约」&#x1f…

基于java进行收藏功能的实现

1.首先进行建表 大部分点赞都是文章&#xff0c;帖子&#xff0c;或者商品的收藏&#xff0c;然后登录用户进行收藏&#xff0c;创建表的话需要文章&#xff0c;帖子&#xff0c;或者商品的id和用户的id&#xff0c;我这里是文章postId和ud 2.接下来就是代码层面的实现 ourc…

探索 Qt WebEngineWidgets:从底层原理到高级应用与技巧

探索 Qt WebEngineWidgets&#xff1a;从底层原理到高级应用与技巧 (Exploring Qt WebEngineWidgets: From Fundamentals to Advanced Applications and Techniques 一、Qt WebEngineWidgets 模块简介及原理 (Introduction and Principles of Qt WebEngineWidgets Module)1. Qt…

(2023)Admob广告实践笔记

开屏 官方最佳实践 最好等到您的用户使用您的应用几次后&#xff0c;再展示您的第一个应用打开广告。在您的用户等待您的应用加载的时间展示应用打开广告。如果您在应用打开广告下方有一个加载屏幕&#xff0c;并且您的加载屏幕在广告关闭之前完成加载&#xff0c;您可能需要…

Jetson Nano (4GB)烧写jetbot Image

一、Image下载 1、官方下载&#xff0c;浏览器访问Using SD Card Image - JetBot&#xff0c;下载jetbot-043_nano-4gb-jp45.zip。 注意&#xff1a;通过此方式下载需要电脑能访问外网。 2、天翼网盘下载&#xff0c;https://cloud.189.cn/t/q2mUJv7jaIna &#xff08;访问码…

对字符串的所有子串的字符种类数求和

题目描述 给定一个长度为n的字符串&#xff0c;求该字符串的所有子串的字符种类数。 暴力方法 遍历所有子串&#xff0c;每次求每个子串的字符种类数&#xff0c;然后求和。 时间复杂度 O ( n 2 ) O(n^2) O(n2) DP 这个之前是真没想过&#xff0c;直到看到了大佬的思路 大…

拼多多的天天618,如何掀开电商营销的“皇帝新衣”?

电商价格战如火如荼&#xff0c;拼多多也在2023年4月正式启动“数码家电消费季”百亿补贴。 首季将在百亿补贴的基础上加码10亿&#xff0c;对手机、平板等各种数码家电&#xff0c;提供全品类补贴&#xff0c;苹果、华为、小米、美的等国内外各大品牌均会参与。拼多多相关负责…

穿拖鞋的汉子考研分享

不打无准备的仗&#xff0c;提前做好攻略&#xff0c;事半功倍&#xff01; 方向一&#xff1a;择校经验 俗话说选择比努力更重要&#xff0c;当自己的方向对了&#xff0c;主要是选择本专业的学校方面&#xff0c;会让自己有更好的收获。 自己从事的工科方向&#xff0c;学习…

【参考文献不爆红】Word的多个参考文献连续交叉引用([1] [3]改为[1-3])

文章目录 1. 参考文献格式2. 引入参考文献3. Word的多个参考文献连续交叉引用&#xff08;[1] [3]改为[1-3]&#xff09;3.1引入两个参考文献3.2 引入三个参考文献3.3 知识科普 1. 参考文献格式 参考教程 全选参考文献–>编号的小三角–>自定义编号&#xff0c;修改为[]…

Elasticsearch 实战篇 | 黑马旅游

一、酒店搜索和分页 需求&#xff1a;实现黑马旅游的酒店搜索功能&#xff0c;完成关键字搜索和分页 1、定义实体类&#xff0c;接收前端的参数 如果当搜索条件为空的时候&#xff0c;就返回全部数据&#xff0c;不为空才按照key来搜索 二、条件过滤 修改实体类&#xff0c;…