ASP.NET Core Identity读书笔记整理
今天主要学习内容知识点回顾:Asp. NET Core 从入门到学会如何做一个安全可复用的框架
3.1 为什么需要密码加密?
由于很多用户是多个网站共用一个密码,因此一个网站密码泄漏就会造成很大的安全隐患。由于有了这么多前车之鉴,我们现在做系统时,密码都要加密处理。
加密方案进化史
Hash算法
-
原始密码经哈希函数计算后得到一个哈希值
-
改变原始密码,哈希函数计算出的哈希值也会相应改变
-
同样的密码,哈希值也是相同的
-
哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少
密码加盐
为了防止黑客通过彩虹表根据哈希值反推原始口令,在计算哈希的时候,不能仅针对原始输入计算,需要增加一个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
学习任重而道远,加油!
- 点赞
- 收藏
- 关注作者
评论(0)