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 模块(本机是指 ...
随机推荐
- 什么是shell【TLCL】
常用命令 date cal df——report file system disk space usage free——display amount of free and used memory i ...
- spring学习(3)
bean的声明周期 为什么把生命周期当做一个重点? Servlet->servlet生命周期 Servlet生命周期分为三个阶段: 1:初始化阶段,调用init()方法 2:响应客户请求阶段,调 ...
- JavaUtil_09_通用工具类-01_Hutool
一.重要的官方资料 1. Hutool 官网 2. Hutool 参考文档 3. Hutool API文档
- php如何判断电脑访问还是手机访问?
手机上网用户数量越来越大,如今各网站都推出了手机网站,电脑用户访问时直接访问电脑版网页,当用户通过手机访问网站时则跳自动跳转到手机版网页,下面给大家分享一段php中判断电脑访问还是手机访问的代码: & ...
- ACM学习历程—Hihocoder 1288 Font Size(暴力 || 二分)
http://hihocoder.com/problemset/problem/1288 这题是这次微软笔试的第一题,关键的是s的上限是min(w, h),这样s的范围只有到1000,这样就可以直接暴 ...
- bzoj 3514: GERALD07加强版 lct+可持久化线段树
题目大意: N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 题解: 这道题考试的时候没想出来 于是便爆炸了 结果今天下午拿出昨天准备的题表准备做题的时候 题表里就有这题 ...
- 开启现有android项目
开启工程 在屏幕上方的选单列上,选择「File->New->Project」, 会弹出「New Project」对话视窗.Eclipse 是通用的编辑环境,可根据你所安装的不同扩充套件而支 ...
- SSH不允许Root登陆的方法
不允许Root登陆的方法如下: vim /etc/ssh/sshd_config 把PermitRootLogin yes 改成: PermitRootLogin no 然后重启sshd服务: Ser ...
- 彻底删除kafka下面的topic
如果只是用kafka-topics.sh的delete命令删除topic,会有两种情况: 如果当前topic没有使用过即没有传输过信息:可以彻底删除 如果当前topic有使用过即有过传输过信息:并没有 ...
- SpringMvc之参数绑定注解详解之二
2 consumes.produces 示例 cousumes的样例: 1 @Controller 2 @RequestMapping(value = "/pets", met ...