.net core 认证与授权(二)
前言
这篇紧接着一来写的,在第一篇中介绍了认证与授权,同时提出了这套机制其实就是模拟现实中的认证与授权。
同样这篇介绍在这套机制下,用户信息管理机制?这里就会问了,上一篇中认证和授权不是都ok了吗,怎么会有一个管理机制呢?当然并不一定要使用下面这套机制,但是给了我们很大的启发。
在上一结中我们颁发证书是这样的:
public IActionResult Authenticate()
{
var SchoolClaims = new List<Claim>()
{
new Claim(ClaimTypes.Name,"Jack"),
new Claim(ClaimTypes.Email,"Jack@fmail.com")
};
var LicensClaims = new List<Claim>()
{
new Claim(ClaimTypes.Name,"Jack.li"),
new Claim(ClaimTypes.Email,"Jack@fmail.com"),
new Claim("begin","2000.10.1")
};
var SchoolIdentity = new ClaimsIdentity(SchoolClaims,"Student Identity");
var CarManagerIdentity = new ClaimsIdentity(LicensClaims, "Licens Identity");
var userPrincipal = new ClaimsPrincipal(new[] { SchoolIdentity, CarManagerIdentity });
HttpContext.SignInAsync(userPrincipal);
return RedirectToAction("Index");
}
有没有发现new Claim(ClaimTypes.Name,"Jack") 写死了?我的信息是要从数据库里面查啊。
这时候微软的框架就跳出来了,说用我的这套机制,帮你搞定,到底是什么机制呢?请看正文。小声逼逼一句,微软就喜欢搞全包工程。
正文均为个人理解,如有不对请指出。
正文
首先提及到一个结构,IdentityUser,这东西是真的博大精深,但是感觉有点臃肿,这很微软。
IdentityUser 这里可以简单说明一下,就是存储用户信息的地方。
既然说到用户存储,那么就要提及到数据库了。
创建了一个AppDbContext:
public class AppDbContext:IdentityDbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options):base(options)
{
}
}
以前我们一般是继承DbContext,DbContext是Ef的上下文。
这里IdentityDbContext,是Ef的扩展,看下我添加了什么。
红色框内是我添加的。
在这里我为了演示使用内存数据库memory,所以我多加了一个库。
然后我在startup中配置使用memory数据库。
services.AddDbContext<AppDbContext>(config =>{
config.UseInMemoryDatabase("Memery");
});
这样就配置了,现在就解决了数据库的问题。
同样需要配置identity:
services.AddIdentity<IdentityUser, IdentityRole>(config=> {
config.Password.RequiredLength = 4;
config.Password.RequireDigit = false;
config.Password.RequireNonAlphanumeric = false;
config.Password.RequireLowercase = false;
config.Password.RequireUppercase = false;
}).AddEntityFrameworkStores<AppDbContext>().AddDefaultTokenProviders();
有几个关键的地方,就是config.Password.RequiredLength = 4;等几个password的配置,
因为identetyUser 有默认的机制就是密码必须要大写,然后不小于6位密码等,我们在这里全部去掉。
AddEntityFrameworkStores() 添加EF 存储实现。
AddDefaultTokenProviders() 默认提供生成token。这种token 用来干啥呢?当然是用来证明用户的了。比如我们修改密码的时候,我们发现链接上有一个token,异曲同工之妙哈。
services.ConfigureApplicationCookie(config =>
{
config.Cookie.Name = "Identity.Cooke";
config.LoginPath = "/Home/Login";
});
加上验证,当没有登陆的时候去到登陆页面。
好的配置我们基本完成了。
接下来就是去实现登陆与注册。
public IActionResult Index()
{
return View();
}
public IActionResult Secret()
{
return View();
}
public IActionResult Login()
{
return View();
}
public IActionResult Register()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Login(string username, string password)
{
var user = await _userManager.FindByNameAsync(username);
if (user != null)
{
//sign in
var Signresult= await _signInManager.PasswordSignInAsync(user,password,false,false);
if (Signresult.Succeeded)
{
return RedirectToAction("Secret");
}
}
return RedirectToAction("Index");
}
[HttpPost]
public async Task<IActionResult> Register(string username,string password)
{
var user = new IdentityUser
{
UserName = username,
Email = ""
};
var result=await _userManager.CreateAsync(user,password);
if (result.Succeeded)
{
var Signresult = await _signInManager.PasswordSignInAsync(user, password, false, false);
if (Signresult.Succeeded)
{
return RedirectToAction("Index");
}
}
return RedirectToAction("Index");
}
看到两个http post:
先看Register:
创建了IdentityUser,用来存储用户信息。
_userManager 是用来管理user用户的,比如说创建,删除,修改,是identetyUser 内部机制。
创建过程如下:
public HomeController(UserManager<IdentityUser> userManager,SignInManager<IdentityUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
var result=await _userManager.CreateAsync(user,password); 如果创建用户成功,那么就进行登陆如下:
var Signresult = await _signInManager.PasswordSignInAsync(user, password, false, false);
注意PasswordSignInAsync登陆的话会产生token,用于验证我们是否登陆。
当我注册后,产生了token,如下:
看下登陆,其实我们在注册部分就已经介绍了登陆了。
我重新把代码放下了:
var user = await _userManager.FindByNameAsync(username);
if (user != null)
{
//sign in
var Signresult= await _signInManager.PasswordSignInAsync(user,password,false,false);
if (Signresult.Succeeded)
{
return RedirectToAction("Secret");
}
}
return RedirectToAction("Index");
发现就多了一步,根据名字去查找user,如果有这个user,然后去比较密码。和平时写code 差不多。
然后登陆后就可以进入了我们想进入的页面。
如果我们想loginout:
public async Task<IActionResult> Logout()
{
await _signInManager.SignOutAsync();
return RedirectToAction("Index");
}
把登陆和注册的页面贴下:
login:
<form action="/Home/Login" method="post">
<input type="text" name="username" value="" />
<input type="password" name="password" value="" />
<button type="submit">登陆</button>
</form>
注册:
<form action="/Home/Register" method="post">
<input type="text" name="username" value="" />
<input type="password" name="password" value="" />
<button type="submit">注册</button>
</form>
在上一篇中,就很疑问了,上一篇没有登录啊。
真的没有登录吗?只是用证书去登录了,不然怎么能过的了检查呢。
HttpContext.SignInAsync("CookieAuth", userPrincipal);
总结
现在我们的流程更加的明显了,先要验证用户信息,比如说是否登录了,这个过程相当于什么呢?我们用我们的名字和指纹(password),去获取到了我们的身份证。有了这张身份证后我们才有其他的证书,然后才有根据证书去获取一些权限。
后续介绍基本的配置,与原理。
.net core 认证与授权(二)的更多相关文章
- .net core 认证与授权(三)
前言 在写三上是在一的基础上写的,所以有没有看过二是没得关系的,在一中介绍了认证与授权,但是没有去介绍拿到证书后怎样去验证授权. 概念性东西:在这套机制中,把这个权限认证呢,称作为policy.这个p ...
- ASP.NET Core 认证与授权[1]:初识认证
在ASP.NET 4.X 中,我们最常用的是Forms认证,它既可以用于局域网环境,也可用于互联网环境,有着非常广泛的使用.但是它很难进行扩展,更无法与第三方认证集成,因此,在 ASP.NET Cor ...
- ASP.NET Core 认证与授权[2]:Cookie认证
由于HTTP协议是无状态的,但对于认证来说,必然要通过一种机制来保存用户状态,而最常用,也最简单的就是Cookie了,它由浏览器自动保存并在发送请求时自动附加到请求头中.尽管在现代Web应用中,Coo ...
- ASP.NET Core 认证与授权[3]:OAuth & OpenID Connect认证
在上一章中,我们了解到,Cookie认证是一种本地认证方式,通常认证与授权都在同一个服务中,也可以使用Cookie共享的方式分开部署,但局限性较大,而如今随着微服务的流行,更加偏向于将以前的单体应用拆 ...
- ASP.NET Core 认证与授权[5]:初识授权
经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段.在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥 ...
- ASP.NET Core 认证与授权[6]:授权策略是怎么执行的?
在上一章中,详细介绍了 ASP.NET Core 中的授权策略,在需要授权时,只需要在对应的Controler或者Action上面打上[Authorize]特性,并指定要执行的策略名称即可,但是,授权 ...
- ASP.NET Core 认证与授权[1]:初识认证 (笔记)
原文链接: https://www.cnblogs.com/RainingNight/p/introduce-basic-authentication-in-asp-net-core.html 在A ...
- .net core 认证与授权(一)
前言 .net core web并不是一个非常新的架构,很多文章提及到认证与授权这个过程,但是一般都会提及到里面的方法怎么用的,而不是模拟一个怎样的过程,所以我打算记录自己的理解. 什么是认证?我们大 ...
- 聊聊 asp.net core 认证和授权
使用asp.net core 开发应用系统过程中,基本上都会涉及到用户身份的认证,及授权访问控制,因此了解认证和授权流程也相当重要,下面通过分析asp.net core 框架中的认证和授权的源码来分析 ...
随机推荐
- Java正则表达式学习与记录
转载自:http://www.runoob.com/java/java-regular-expressions.html 正则表达式定义了字符串的模式,用于搜索.编辑或处理文本. 1.正则表达式中字符 ...
- 给你的 ASP.NET Core 程序插上 Feature Flag 的翅膀
前言 我们知道,目前大多数应用程序在正式发布到生产环境之前都会经历多个不同的测试环境,通过让应用程序在多个不同的环境中运行来及时发现并解决问题,避免在线上发生不必要的损失.这是对于整个软件的发布流程来 ...
- 【小技巧】只用css实现带小三角的对话框样式
一个小小的技巧: 如图所示,这种小三角,不用图片,只用css怎么实现呢? 直接上代码吧: <!DOCTYPE html> <html> <head> <tit ...
- $HDU$ 4336 $Card\ Collector$ 概率$dp$/$Min-Max$容斥
正解:期望 解题报告: 传送门! 先放下题意,,,已知有总共有$n$张卡片,每次有$p_i$的概率抽到第$i$张卡,求买所有卡的期望次数 $umm$看到期望自然而然想$dp$? 再一看,哇,$n\le ...
- map类型转为实体类
BareBaseRequest fromJson = JSON.parseObject(JSON.toJSONString(map), BareBaseRequest.class);
- ObserverPattern(观察者模式)-----Java/.Net
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式
- VS/Xamarin Android入门一
一.安装和配置(以Visual Studio Pro 2015为例) Visual Studio2015直接提供了这个插件的选择项,稍微提示一下,如果要安装的话,最好准备好十个小时的打算,而且是网速不 ...
- 2013 ACM-ICPC亚洲区域赛南京站C题 题解 轮廓线DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题目大意 给你一个 \(n \times m\) 的矩形区域.你需要用 \(1 \times 1 ...
- 03_常用的JS正则表达式54种形式类型
1.由数字.26个英文字母或者下划线组成的字符串: ^[0-9a-zA-Z_]{1,}$ 2.非负整数(正整数 + 0 ): ^/d+$ 3. 正整数: ^[0-9]*[1-9][0-9]*$ 4.非 ...
- 通俗易懂理清mybatis中SqlSessionSql、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean之间的关系
我潇洒的灰大狼又回来啦.今天送大家的一句话是: 保持耐心,永远年轻,永远热泪盈眶. 前言 先容我哭一会儿,呜呜呜~昨晚写了一半的文章,还没保存就盖上盖子准备回家,拔下电源准备把电脑塞进书包带回家完成时 ...