前言

这篇紧接着一来写的,在第一篇中介绍了认证与授权,同时提出了这套机制其实就是模拟现实中的认证与授权。

同样这篇介绍在这套机制下,用户信息管理机制?这里就会问了,上一篇中认证和授权不是都ok了吗,怎么会有一个管理机制呢?当然并不一定要使用下面这套机制,但是给了我们很大的启发。

在上一结中我们颁发证书是这样的:

  1. public IActionResult Authenticate()
  2. {
  3. var SchoolClaims = new List<Claim>()
  4. {
  5. new Claim(ClaimTypes.Name,"Jack"),
  6. new Claim(ClaimTypes.Email,"Jack@fmail.com")
  7. };
  8. var LicensClaims = new List<Claim>()
  9. {
  10. new Claim(ClaimTypes.Name,"Jack.li"),
  11. new Claim(ClaimTypes.Email,"Jack@fmail.com"),
  12. new Claim("begin","2000.10.1")
  13. };
  14. var SchoolIdentity = new ClaimsIdentity(SchoolClaims,"Student Identity");
  15. var CarManagerIdentity = new ClaimsIdentity(LicensClaims, "Licens Identity");
  16. var userPrincipal = new ClaimsPrincipal(new[] { SchoolIdentity, CarManagerIdentity });
  17. HttpContext.SignInAsync(userPrincipal);
  18. return RedirectToAction("Index");
  19. }

有没有发现new Claim(ClaimTypes.Name,"Jack") 写死了?我的信息是要从数据库里面查啊。

这时候微软的框架就跳出来了,说用我的这套机制,帮你搞定,到底是什么机制呢?请看正文。小声逼逼一句,微软就喜欢搞全包工程。

正文均为个人理解,如有不对请指出。

正文

首先提及到一个结构,IdentityUser,这东西是真的博大精深,但是感觉有点臃肿,这很微软。

IdentityUser 这里可以简单说明一下,就是存储用户信息的地方。

既然说到用户存储,那么就要提及到数据库了。

创建了一个AppDbContext:

  1. public class AppDbContext:IdentityDbContext
  2. {
  3. public AppDbContext(DbContextOptions<AppDbContext> options):base(options)
  4. {
  5. }
  6. }

以前我们一般是继承DbContext,DbContext是Ef的上下文。

这里IdentityDbContext,是Ef的扩展,看下我添加了什么。



红色框内是我添加的。

在这里我为了演示使用内存数据库memory,所以我多加了一个库。

然后我在startup中配置使用memory数据库。

  1. services.AddDbContext<AppDbContext>(config =>{
  2. config.UseInMemoryDatabase("Memery");
  3. });

这样就配置了,现在就解决了数据库的问题。

同样需要配置identity:

  1. services.AddIdentity<IdentityUser, IdentityRole>(config=> {
  2. config.Password.RequiredLength = 4;
  3. config.Password.RequireDigit = false;
  4. config.Password.RequireNonAlphanumeric = false;
  5. config.Password.RequireLowercase = false;
  6. config.Password.RequireUppercase = false;
  7. }).AddEntityFrameworkStores<AppDbContext>().AddDefaultTokenProviders();

有几个关键的地方,就是config.Password.RequiredLength = 4;等几个password的配置,

因为identetyUser 有默认的机制就是密码必须要大写,然后不小于6位密码等,我们在这里全部去掉。

AddEntityFrameworkStores() 添加EF 存储实现。

AddDefaultTokenProviders() 默认提供生成token。这种token 用来干啥呢?当然是用来证明用户的了。比如我们修改密码的时候,我们发现链接上有一个token,异曲同工之妙哈。

  1. services.ConfigureApplicationCookie(config =>
  2. {
  3. config.Cookie.Name = "Identity.Cooke";
  4. config.LoginPath = "/Home/Login";
  5. });

加上验证,当没有登陆的时候去到登陆页面。

好的配置我们基本完成了。

接下来就是去实现登陆与注册。

  1. public IActionResult Index()
  2. {
  3. return View();
  4. }
  5. public IActionResult Secret()
  6. {
  7. return View();
  8. }
  9. public IActionResult Login()
  10. {
  11. return View();
  12. }
  13. public IActionResult Register()
  14. {
  15. return View();
  16. }
  17. [HttpPost]
  18. public async Task<IActionResult> Login(string username, string password)
  19. {
  20. var user = await _userManager.FindByNameAsync(username);
  21. if (user != null)
  22. {
  23. //sign in
  24. var Signresult= await _signInManager.PasswordSignInAsync(user,password,false,false);
  25. if (Signresult.Succeeded)
  26. {
  27. return RedirectToAction("Secret");
  28. }
  29. }
  30. return RedirectToAction("Index");
  31. }
  32. [HttpPost]
  33. public async Task<IActionResult> Register(string username,string password)
  34. {
  35. var user = new IdentityUser
  36. {
  37. UserName = username,
  38. Email = ""
  39. };
  40. var result=await _userManager.CreateAsync(user,password);
  41. if (result.Succeeded)
  42. {
  43. var Signresult = await _signInManager.PasswordSignInAsync(user, password, false, false);
  44. if (Signresult.Succeeded)
  45. {
  46. return RedirectToAction("Index");
  47. }
  48. }
  49. return RedirectToAction("Index");
  50. }

看到两个http post:

先看Register:

创建了IdentityUser,用来存储用户信息。

_userManager 是用来管理user用户的,比如说创建,删除,修改,是identetyUser 内部机制。

创建过程如下:

  1. public HomeController(UserManager<IdentityUser> userManager,SignInManager<IdentityUser> signInManager)
  2. {
  3. _userManager = userManager;
  4. _signInManager = signInManager;
  5. }

var result=await _userManager.CreateAsync(user,password); 如果创建用户成功,那么就进行登陆如下:

  1. var Signresult = await _signInManager.PasswordSignInAsync(user, password, false, false);

注意PasswordSignInAsync登陆的话会产生token,用于验证我们是否登陆。

当我注册后,产生了token,如下:



看下登陆,其实我们在注册部分就已经介绍了登陆了。

我重新把代码放下了:

  1. var user = await _userManager.FindByNameAsync(username);
  2. if (user != null)
  3. {
  4. //sign in
  5. var Signresult= await _signInManager.PasswordSignInAsync(user,password,false,false);
  6. if (Signresult.Succeeded)
  7. {
  8. return RedirectToAction("Secret");
  9. }
  10. }
  11. return RedirectToAction("Index");

发现就多了一步,根据名字去查找user,如果有这个user,然后去比较密码。和平时写code 差不多。

然后登陆后就可以进入了我们想进入的页面。

如果我们想loginout:

  1. public async Task<IActionResult> Logout()
  2. {
  3. await _signInManager.SignOutAsync();
  4. return RedirectToAction("Index");
  5. }

把登陆和注册的页面贴下:

login:

  1. <form action="/Home/Login" method="post">
  2. <input type="text" name="username" value="" />
  3. <input type="password" name="password" value="" />
  4. <button type="submit">登陆</button>
  5. </form>

注册:

  1. <form action="/Home/Register" method="post">
  2. <input type="text" name="username" value="" />
  3. <input type="password" name="password" value="" />
  4. <button type="submit">注册</button>
  5. </form>

在上一篇中,就很疑问了,上一篇没有登录啊。

真的没有登录吗?只是用证书去登录了,不然怎么能过的了检查呢。

  1. HttpContext.SignInAsync("CookieAuth", userPrincipal);

总结

现在我们的流程更加的明显了,先要验证用户信息,比如说是否登录了,这个过程相当于什么呢?我们用我们的名字和指纹(password),去获取到了我们的身份证。有了这张身份证后我们才有其他的证书,然后才有根据证书去获取一些权限。

后续介绍基本的配置,与原理。

.net core 认证与授权(二)的更多相关文章

  1. .net core 认证与授权(三)

    前言 在写三上是在一的基础上写的,所以有没有看过二是没得关系的,在一中介绍了认证与授权,但是没有去介绍拿到证书后怎样去验证授权. 概念性东西:在这套机制中,把这个权限认证呢,称作为policy.这个p ...

  2. ASP.NET Core 认证与授权[1]:初识认证

    在ASP.NET 4.X 中,我们最常用的是Forms认证,它既可以用于局域网环境,也可用于互联网环境,有着非常广泛的使用.但是它很难进行扩展,更无法与第三方认证集成,因此,在 ASP.NET Cor ...

  3. ASP.NET Core 认证与授权[2]:Cookie认证

    由于HTTP协议是无状态的,但对于认证来说,必然要通过一种机制来保存用户状态,而最常用,也最简单的就是Cookie了,它由浏览器自动保存并在发送请求时自动附加到请求头中.尽管在现代Web应用中,Coo ...

  4. ASP.NET Core 认证与授权[3]:OAuth & OpenID Connect认证

    在上一章中,我们了解到,Cookie认证是一种本地认证方式,通常认证与授权都在同一个服务中,也可以使用Cookie共享的方式分开部署,但局限性较大,而如今随着微服务的流行,更加偏向于将以前的单体应用拆 ...

  5. ASP.NET Core 认证与授权[5]:初识授权

    经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段.在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥 ...

  6. ASP.NET Core 认证与授权[6]:授权策略是怎么执行的?

    在上一章中,详细介绍了 ASP.NET Core 中的授权策略,在需要授权时,只需要在对应的Controler或者Action上面打上[Authorize]特性,并指定要执行的策略名称即可,但是,授权 ...

  7. ASP.NET Core 认证与授权[1]:初识认证 (笔记)

    原文链接:  https://www.cnblogs.com/RainingNight/p/introduce-basic-authentication-in-asp-net-core.html 在A ...

  8. .net core 认证与授权(一)

    前言 .net core web并不是一个非常新的架构,很多文章提及到认证与授权这个过程,但是一般都会提及到里面的方法怎么用的,而不是模拟一个怎样的过程,所以我打算记录自己的理解. 什么是认证?我们大 ...

  9. 聊聊 asp.net core 认证和授权

    使用asp.net core 开发应用系统过程中,基本上都会涉及到用户身份的认证,及授权访问控制,因此了解认证和授权流程也相当重要,下面通过分析asp.net core 框架中的认证和授权的源码来分析 ...

随机推荐

  1. ulimit -u 解决 Jenkins OOM 错误

    Apr 24, 2018 11:19:48 AM hudson.init.impl.InstallUncaughtExceptionHandler$DefaultUncaughtExceptionHa ...

  2. .NET 半天搭建Jenkins持续集成与自动化部署系统

    前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们所做的系统业务复杂,系统庞大,设计到多个系统之间的合作,而核心系统更是采用分布式系统架构,由 ...

  3. 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)

    [题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...

  4. [03]java中的方法以及控制语句

    00 Java中的语句块 语句块(有时叫做复合语句),是用花括号扩起的任意数量的简单Java语句.块确定了局部变量的作用域.块中的程序代码,作为一个整体,是要被一起执行的.块可以被嵌套在另一个块中,但 ...

  5. 1030 完美数列 (25 分)C、Java、python

    题目描述 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完 ...

  6. iscsi,nfs

    存储概述 存储的目标 存储是根据不同的应用环境通过采取合理.安全.有效的方式将数据保存到某些介质上并能保证有效的访问. 一方面它是数据临时或长期驻留的物理媒介. 另一方面,它是保证数据完整安全存放的方 ...

  7. zTree 节点勾选取消勾选 选中取消选中

    zTreeObj.cancelSelectedNode function 举例 取消当前所有被选中节点的选中状态 var treeObj = $.fn.zTree.getZTreeObj(" ...

  8. 构造函数以及关键词this

    Java中所有类都有构造方法,用来进行该类对象的初始化,构造方法也有名称,参数和方法体以及访问权限的设定. 1.构造方法的完整定义格式如下: [public|protected|private]< ...

  9. 晨叔技术晨报: 你真的搞懂JS中的“值传递”和“引用传递”吗?

    晨叔周刊,每周一话题,技术天天涨. 本周的话题是JS的内存问题(加入本周话题,请点击传送门). 图 话题入口 今天的技术晨报来,就来谈谈JS中变量的,值传递和引用传递的问题.现在,对于很多的JSer来 ...

  10. Redis-缓存穿透、缓存雪崩、缓存击穿、缓存一致性、并发竞争

    缓存流程 在讲这五个问题之前,首先我们回顾下正常的缓存的使用流程 程序在处理请求时,会先从缓存中进行查询,如果缓存中没有对应的key,则会从数据库中查询,如果查询到结果,并将查询结果添加到缓存中去,反 ...