ASP.NET CORE系列【四】基于Claim登录授权
介绍
关于什么是Claim?
可以看看其他大神的文章:
http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-based-authentication-and-owin.html
http://www.cnblogs.com/savorboard/p/aspnetcore-identity.html
注:本人目前还是菜鸟初学阶段,如有写错的地方,望各位大鸟 指出!
场景
用户登录是一个非常常见的应用场景 .net core的登录方式跟以往有些不同,可以说是往好的方向发展,变得更容易扩展,更方便。
在上一章里面,有过简单的介绍,那么这一章,我们来详细看看。
配置
1.首先需要NuGet安装一个包:Microsoft.AspNetCore.Authentication.Cookies
打开项目中的Startup.cs文件,找到ConfigureServices方法,我们通常在这个方法里面做依赖注入的相关配置。
public void ConfigureServices(IServiceCollection services)
{//增加Cookie中间件配置
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "MyCookieAuthenticationScheme";
options.DefaultChallengeScheme = "MyCookieAuthenticationScheme";
options.DefaultSignInScheme = "MyCookieAuthenticationScheme"; })
.AddCookie("MyCookieAuthenticationScheme", options =>
{
//options.AccessDeniedPath = "/Account/Forbidden";
options.LoginPath = "/Home/Login";
});
}
这里的代码意思是 添加授权,添加使用Cookie的方式,配置登录页面和没有权限时的跳转页面。
2.再找到Configure方法,添加 app.UseAuthentication(),使用授权:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, EFCoreContext context)
{ app.UseAuthentication(); }
3.创建一个新的 Controller,并添加登录的方法:
public async Task<IActionResult> Login([FromBody] SysUser sysUser)
{
//使用ef获取用户
var info = _context.SysUsers.Where(m => m.UserName == sysUser.UserName && m.PassWord == sysUser.PassWord).FirstOrDefault();
if (info != null)
{
//创建一个身份认证
var claims = new List<Claim>() {
new Claim(ClaimTypes.Sid,info.Id.ToString()), //用户ID
new Claim(ClaimTypes.Name,info.UserName) //用户名称
}; var identity = new ClaimsIdentity(claims, "TestLogin");
var userPrincipal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync("MyCookieAuthenticationScheme", userPrincipal, new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddMinutes(),
IsPersistent = false,
AllowRefresh = false
});
return Json(new
{
success = true
});
}
else
{
return Json(new
{
success = false,
message = "账户名密码错误!"
});
}
}
由以上代码,我们来具体分析。
ASP.NET Core 的验证模型是 claims-based authentication 。Claim 是对被验证主体特征的一种表述,比如:登录用户名是xxx,email是xxx,其中的“登录用户名”,“email”就是ClaimType.
一组claims构成了一个identity,具有这些claims的identity就是 ClaimsIdentity
var claims = new List<Claim>() {
new Claim(ClaimTypes.Sid,info.Id.ToString()), //用户ID
new Claim(ClaimTypes.Name,info.UserName) //用户名称
};
var identity = new ClaimsIdentity(claims, "Login");
ClaimsIdentity的持有者就是 ClaimsPrincipal
var userPrincipal = new ClaimsPrincipal(identity);
一个ClaimsPrincipal可以持有多个ClaimsIdentity,就比如一个人既持有驾照,又持有护照.
var userPrincipal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync("MyCookieAuthenticationScheme", userPrincipal, new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddMinutes(),
IsPersistent = false,
AllowRefresh = false
});
理解了Claim, ClaimsIdentity, ClaimsPrincipal这三个概念,就能理解生成登录Cookie为什么要用之前的代码。
要用Cookie代表一个通过验证的主体,必须包含Claim, ClaimsIdentity, ClaimsPrincipal这三个信息,ClaimsPrincipal就是持有证件的人,ClaimsIdentity就是证件,"Login"就是证件类型(这里假设是驾照),Claim就是驾照中的信息。
我们在需要验证权限的Action上面加入[Authorize] 就可以了, 如果没有登录状态,会跳转到Login页面, 如何配置跳转,已经各种其他的配置,见Startup.cs文件、
public IActionResult Index()
{//取用户信息
var userId = User.FindFirst(ClaimTypes.Sid).Value;
var userName = User.Identity.Name;
return View();
}
为什么User.Identity.Name可以取到用户名呢, 我们看看User的定义:

没错,他就是我们上面说的ClaimsPrincipal
此时,我掏出身份证(ClaimsIdentity),身份证上面有我的名称 (claim)
4.退出登录
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync("MyCookieAuthenticationScheme");
return RedirectToAction("Index", "Home");
}
ASP.NET CORE系列【四】基于Claim登录授权的更多相关文章
- Asp.net Core 系列之--5.认证、授权与自定义权限的实现
ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...
- 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)
黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...
- .net core 基于Claim登录验证
网站,首先需要安全,实现安全就必须使用登录验证,.net core 基于Claim登录验证就很简单使用. Claim是什么,可以理解为你的身份证的中的名字,性别等等的每一条信息,然后Claim组成一个 ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...
- asp.net core系列 49 Identity 授权(上)
一.概述 授权是指用户能够访问资源的权限,如页面数据的查看.编辑.新增.删除.导出.下载等权限.ASP.NET Core 授权提供了多种且灵活的方式,包括:Razor pages授权约定.简单授权.R ...
- asp.net core系列 31 EF管理数据库架构--必备知识 反向工程
一. 反向工程 反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC.对于其他开发环境,请选择.NET Core CLI工具( ...
- asp.net core 系列 18 web服务器实现
一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...
随机推荐
- AJAX+json+jquery实现预加载瀑布流布局
宽度是一定的高度不定的瀑布流布局 也可以说是无缝拼图 当浏览器滚动到底部时候自动加载图片 加载的图片地址用json 在img.js里 ,还有正在加载动画是用 css3制作的 在ff等支持css3可以显 ...
- jQuery JS 入门记录
1.类型转换 .toString() 转字符串 . parseInt() parseFloat() 强制转换 数字型(Number) 1.声明 var i = 1; var i = new Numbe ...
- appium-环境搭建(一)
adb命令 adb的全称为Android Debug Bridge,就是起到调试桥的作用.借助adb工具,我们可以管理设备或者手机模拟器的状态.还可以进行很多手机操作,如安装软件\系统升级\运行she ...
- hdu-5646 DZY Loves Partition(贪心)
题目链接: DZY Loves Partition Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K ( ...
- kudu安装以及kudu的坑
本文描述的是kudu在cloudera的安装. 首先cloudera 5.11.1版本尽管可以直接在add Services中看到kudu,但是其实并没有集成parcels,而且也不想kafka提示需 ...
- BZOJ1113:[POI2008]PLA
浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ1636&&1699:[USACO2007JAN]Balanced Lineup
浅谈\(RMQ\):https://www.cnblogs.com/AKMer/p/10128219.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...
- 关于Snoop的用法
snoop是开发wpf应用程序的利器.用它可以观察WPF的可视树,监听事件,更改元素属性等. 下面我介绍下snoop一些用法. 1.获取指定应用程序的UI 打开snoop,选择"Drag ...
- 【转】Pro Android学习笔记(八):了解Content Provider(下中)
在之前提供了小例子BookProvider,我们回过头看看如何将通过该Content Provider进行数据的读取. (1)增加 private void addBook(String name , ...
- java web 基础 json 和 javaBean转化
github地址: https://github.com/liufeiSAP/JavaWebStudy 实体类: package com.study.demo.domain; import com.f ...