介绍

关于什么是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登录授权的更多相关文章

  1. Asp.net Core 系列之--5.认证、授权与自定义权限的实现

    ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...

  2. Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  3. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  4. .net core 基于Claim登录验证

    网站,首先需要安全,实现安全就必须使用登录验证,.net core 基于Claim登录验证就很简单使用. Claim是什么,可以理解为你的身份证的中的名字,性别等等的每一条信息,然后Claim组成一个 ...

  5. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  6. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...

  7. asp.net core系列 49 Identity 授权(上)

    一.概述 授权是指用户能够访问资源的权限,如页面数据的查看.编辑.新增.删除.导出.下载等权限.ASP.NET Core 授权提供了多种且灵活的方式,包括:Razor pages授权约定.简单授权.R ...

  8. asp.net core系列 31 EF管理数据库架构--必备知识 反向工程

    一.   反向工程 反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC.对于其他开发环境,请选择.NET Core CLI工具( ...

  9. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

随机推荐

  1. linux 磁盘管理与文件系统

    一.磁盘分区的意义 磁盘分区就是为了将磁盘分成不同的逻辑区域,每个分区可以有不同的文件系统 二. 磁盘分区是按照磁盘的柱面进行分区的,由于盘片在转动时的角速度都是一样的,所以磁头在最外层的磁道上读取信 ...

  2. NOI 模拟赛 #2

    得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...

  3. uoj279温暖会指引我们前行

    暖气来啦~ 动态树维护最大生成树裸题 #include<iostream> #include<cstdio> #include<cstdlib> #include& ...

  4. luogu2622开灯问题2

    #include<iostream> #include<cstdlib> #include<algorithm> #include<cstdio> #i ...

  5. 自定义type为file型input控件+该控件具有本地图片预览功能

    最近的一个项目需求是写一个type为filex型的input控件,这个控件: 第一,要自定义样式: 第二,要能直接在本地预览上传的图片: 第三,要能检测图片的尺寸是否符合要求. 故综合网上的资源写了下 ...

  6. C++输入输出知识

    1.strtok将字符串中的单词用' '分割出来 #include<iostream> #include<cstdio> #include<cstdlib> #in ...

  7. nginx利用proxy_cache来缓存文件

    为什么要做web cache,我想大家最主要的是解决流量的压力.随着网站流量的提升,如果只是单台机器既处理静态文件,又处理动态脚本,显然效率很难上升,不能处理日益上涨的流量压力.与此同时某些网站的页面 ...

  8. Webpack打包之后[-webkit-box-orient: vertical]样式丢失

    背景:项目是用的vue全家桶套餐 今天在工作中遇到一个问题,需求是要求文字只能显示3行,超过3行则隐藏且显示 '...', 于是我加了如下样式在标签里面: display: -webkit-box;- ...

  9. css之布局

    布局一直是页面制作很重要的部分,有个良好的布局不仅在页面上呈现很好的效果,还对后续功能扩展有重要的作用.本文主要讨论一下几种布局: 水平居中布局 垂直居中布局 多列布局 自适应布局 stracky-f ...

  10. Eclipse调试Java程序技巧

    主要步骤.Debug As"->"Java Application".双击设置断点,F5是跳进,F6是执行下一步,F7是跳出 在看这篇文章前,我推荐你看一下Ecli ...