ASP.NET Core Identity读书笔记整理

举报
花溪 发表于 2021/06/17 14:35:55 2021/06/17
【摘要】 今天主要学习内容知识点回顾:Asp. NET Core 从入门到学会如何做一个安全可复用的框架3.1 为什么需要密码加密?由于很多用户是多个网站共用一个密码,因此一个网站密码泄漏就会造成很大的安全隐患。由于有了这么多前车之鉴,我们现在做系统时,密码都要加密处理。加密方案进化史Hash算法原始密码经哈希函数计算后得到一个哈希值改变原始密码,哈希函数计算出的哈希值也会相应改变同样的密码,哈希值也...

今天主要学习内容知识点回顾:Asp. NET Core 从入门到学会如何做一个安全可复用的框架

3.1 为什么需要密码加密?

由于很多用户是多个网站共用一个密码,因此一个网站密码泄漏就会造成很大的安全隐患。由于有了这么多前车之鉴,我们现在做系统时,密码都要加密处理。

加密方案进化史

Hash算法

  1. 原始密码经哈希函数计算后得到一个哈希值

  2. 改变原始密码,哈希函数计算出的哈希值也会相应改变

  3. 同样的密码,哈希值也是相同的

  4. 哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少

密码加盐

为了防止黑客通过彩虹表根据哈希值反推原始口令,在计算哈希的时候,不能仅针对原始输入计算,需要增加一个salt来使得相同的输入也能得到不同的哈希,这样,大大增加了黑客破解的难度。

自适应单向函数

现在鼓励开发人员利用自适应单向函数来存储密码。开发人员来设定不同的worker factor满足不同的安全需要,在安全和效率之间做出权衡。例如: bcrypt , PBKDF2 , scrypt , and Argon2 .

ASP.NET Core Identity是使用什么密码加密  HASH256 

开放式重定向漏洞:

  • 用户可能会被诱导到其他木马网站导致账号被盗。
  • ASP.NET Core 中内置的LocalRedirect()方法可以防止重定向攻击。
  • 允许url访问非本地URL需要自行扩展白名单地址栏。

3.2 ASP. NET Core身份( dentity认证介绍

ASP. NET Core Identity是一个会员身份系统,最早的时候它的名字还叫" Membership",当然那是一个古老的历史,现在我们来了解全新的 Identity 吧。

  • 它是一个完善的,全面的,庞大的框架。
  • 创建查询更改删除账户信息。
  • 验证和授权。
  • 密码重置。
  • 双重身份认证。
  • 支持扩展登录,如微软、 Facebook、谷歌,Qα微信等等。
  • 它还提供了一个丰富的AP,并且这些AP还可以进行大量的扩展。
  • ASP.NET Core Identity中用户表与角色表的关联关系是多对多 。

3.3 如何使用和扩展 ASP. NET Core Identity框架

  • 让 DbContet类继承identity DbContext类
public class AppDbContext: IdentityDbContext
{
   public AppDbContext(DbContextoptions<AppDbContext> options ): base(options)
  {
  }
  public Dbset<student> Students{ get; set;}
 
  protected override void OnModelCreating(ModelBuilder modelBuilder)
  {
   base. OnModelCreating(modelBuilder);
   modelBuilder.Seed();
  }
}
  • 配置Asp.Net Core ldentity服务
public void ConfigureServices(IServiceCollection services)
{
   services. AddDbContextPool<AppDbContext>(
  options =>options. UseSqlServer(_config.GetConnectionString("StudentDBConnection)));
   services. AddIdentity<IdentityUser, IdentityRole>()
        .AddEntity Framework Stores<AppDbContext>();
   services. AddMvcO. AddXm1SerializerFormatters ():
   services. AddScoped<IStudentRepository, SQLStudentRepository>();
}
  • 添加认证中间件
pblic void Configure (IApplicationBui lder app, IWebHostEnvironment env)
{
//如果环境是 Development serve DeveLoper Exception Page
if (env. IsDeveLopment())
{
app.UseDeveLoperException();
}
//否则提供友好错误页面联系信息
else if (env. IsStaging()||env. IsProduction()|| env. IsEnvironmentC"UAT"))
{
app. Use ExceptionHandler("/Error");
app. UseStatusCodePageswithReExecute("/Error/[e]")
}
//使用纯静态文件支持的中间件,而不使用带有终端中间件
app. UseStaticFiles();
//添加身份认证中间件
app. UseAuthentication()
//添加授权中间件
app. UseAuthorization()
app. UseEndpoints (endpoints =>
{
   endpoints. MapControLlerRoute(
     name:"default",
      pattern: "(controller=Home)action=Index)/Lid?)");
});
)
  • 在 Startup类的 Configure()方法中,调用 UseAuthentication()方法。
  • 将 Authentication中间件添加到应用程序的请求处理管道中。
  • 我们希望能够在请求到达MVC中间件之前对用户进行身份验证。因此,在请求处理管道中的 UseRouting中间件之前添加认证中间件,这个很重要因为我们之前讲过中间件的顺序不能乱。


  • 扩展 IdentityUser类

         如果我们想保存额外的用户数据,如性别、城市、国家等,该怎么办? 扩展 IdentityUser类

  • 指定 ApplicationUser类作为 identityDbContext类的泛型参数

  • 在 AspNetUsers表中保存自定义数据

public class RegisterViewModel
{
 [Required]
 [EmaiLAddress]
 [ Display(Name="邮箱")
 [Remote (action: "IsEmaiLInUse", controller: "Account")
 [ValidEmaiLDomain CallowedDomain: 52abp com",
 ErrorMessage="电子邮件的后缀必须是52abp.com")
 public string Email{ get; set;}
 [Required]
 [DataType(DataType Password)]
 [ Display(Name="密码")]
 public string password { get; set;}
 [DataType(DataType Password)]
 [ DispLay(Name="确认密码")]
 [Compare CotherProperty: "Password",
        ErrorMessage="密码与确认密码不一致,请重新输入."〕]
 public string ConfirmPassword { get; set;}
 [ Display(Name="城市")]
  public string City { get; set; }
}

3.4授权与验证的关系

  • 身份验证是用于识别用户的身份。
  • 授权是用于识别用户可以做什么和不能做什么的过程。
  • ASP.NET Core MVC中的授权通过[ Authorize] Attribute控制。

我们假设有一个 Homecontro11er,在 Home Controller之中,我们可以给它添加一个授权属性`[ Authorize]`

[Authorize]
public class HomeController:Controller
{
  public ViewResult Details(int? id)
{
}
  public ViewResult Create()
{
}
  public ViewResult Edit(int id)
{
}
}
public class HomeController:Controller
{
  [Authorize]
  public ViewResult Details(int? id)
{
}
  public ViewResult Create()
{
}
  public ViewResult Edit(int id)
{
}
}

3.5基于角色的访问控制(RBAC)与基于声明的访问控制(CBAC)

  • ASP NET Core中的 Rolemanager

          UserManager<ldentityUser>
          RoleManager<ldentity Role>

public class Administrator Controller: Controller
{
    private readonly RoleManager<IdentityRole> roleManager;

      public Administrator Controller (RoleManager<IdentityRole> roleManager)
     {
       this roleManager roleManager;
     }
}

        内置的 Identityrole类表示一个Role,RoleManager类执行所有CRUD操作,即从基础数据库表 AspNetRoles创建,读取,更新和删除角色,我们需要将 Identityrole类指定为 RoleManager的泛型参数,来告诉 RoleManager服务采用的是 IdentityRole类,然后通过ASP.NET core依赖注入系统, RoleManager可供任何控制器或视图使用

[Httppost]
public async Task<IActionResult> CreateRole(CreateRoleviewModel model)
{
      if(Modelstate. IsValid)
 {
        IdentityRole identityRole =new IdentityRole { Name =model RoleName };
         IdentityResult result= await roleManager. CreateAsync(identityRole);
        if (result Succeeded)
        {
             return RedirectToAction ("index",home");
        }
       foreach (IdentityError error in result. Errors)
        {
            Modelstate. AddModelerror("",error Description);   
       }

  }
     return View(model);
}
  • 编辑 ASP.NET Core中的角色

  • 声明式授权验证

我们的声明(C1aim)是基于策略( Policy)而来。
比如我们开发了一款抢红包的游戏,要满足这个抢红包的条件,需要包含一个或多个声明。
通常基于声明的授权需要使用将 Policy与 Authorize属性的Po1icy参数一起实现,

创建验证策略

services. AddAuthorization(options =>
{
     options. AddPolicy(" DeleteRolePolicy",
        policy = >policy. RequireClaim("Delete Role"));
});

使用 Authorize特性进行策略校验

[Httppost]
[Authorize(policy: " DeleteRolePolicy")]
public async Task<IActionResult> DeleteRole(string id)
{
  var role =await roleManager. FindByIdAsync(id)
}

AllowAnonymous属性

  • AllowAnonymous属性修饰访问大于Authorize属性。
  • AllowAnonymous添加在控制器上时会覆盖所有操作方法上的Authorize属性。
  • AllowAnonymous添加在有Authorize属性的控制器上也可以生效。

3.6一个项目账户中心应该具备的功能

账户中心。每一个系统都应该拥有账户中心,他们都是一些标准的功能,包括不限于登录、注册、忘记密码、邮箱验证、手机号码验证等等内容。我们会完成的功能如下:

  • 第三方登录集成
  • Microsoft与 Github账号的外部登录
  • 双因子身份验证验证
  • 电子邮件的验证
  • 忘记密码
  • 重置密码
  • 邮箱激活

配套源码:yoyomooc / MockSchool · GitLab  https://code.52abp.com/yoyomooc/MockSchool

学习任重而道远,加油!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。