前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >.NET core3.1使用cookie进行身份认证

.NET core3.1使用cookie进行身份认证

作者头像
李明成
发布于 2020-08-28 06:51:28
发布于 2020-08-28 06:51:28
1.3K00
代码可运行
举报
文章被收录于专栏:dotNET知音dotNET知音
运行总次数:0
代码可运行

一个系统,用户身份认证少不了,ASP.NET Core提供完整的解决方案Identity,用户创建和维护登录名;也提供能cookie和JwtBearer认证方案,当然你可以使用第三方认证Oauth、openId。项目没有采用前后端分离,是一个标准的mvc项目,所以本文采用系统提供的cookie认证 记录一下简单认证流程,(1)使用用户账号密码进行登录,验证合法登录(2)确认合法身份之后,会颁发一个认证票据(加密)会携带与该用户相关的身份、权限以及其他信息。(3)退出。

主要会使用Microsoft.AspNetCore.Authentication.Abstractions包中 AuthenticationHttpContextExtensions类,它是基于HttpContext上公开身认证的扩展法:

方法

描述

SignInAsync

登录用户.用户登录成功后颁发一个证书(加密的用户凭证,这个凭证放入Cookie中),用来标识用户的身份

SignOutAsync

注销退出.清除Cookie

GetTokenAsync

用来获取 AuthenticationProperties 中保存的额外信息

ForbidAsync

通知用户权限不足,如果是ajax请求返回403状态码,不是ajax请求跳转指定的url

ChallengeAsync

通知用户需要登录。在默认实现类AuthenticationHandler中,返回401

AuthenticateAsync

验证在 SignInAsync 中颁发的证书,并返回一个 AuthenticateResult 对象,表示用户的身份。

登录创建一个cookie认证

这里涉及几个对象:Claim声明常常代表,认证用户身份的元数据信息,比如手机号、邮箱、用户名等等。ClaimsIdentity声明主体,代表一个认证用户的身份证,当然包含声明的集合。ClaimsPrincipal身份证持有者。

流程:创建一个包含用户信息的 cookie需要构造一个ClaimsPrincipal。将序列化用户信息并将其存储在中 cookie 。

用必要的 Claim来构造一个ClaimsIdentity,然后调用 SignInAsync 来登录用户。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public async Task<Result> UserLogin([FromForm] UserLoginInput input)
        {
            //登录逻辑
            var model = userService.UserLogin(input);

            //1.创建cookie 保存用户信息,使用claim。将序列化用户信息并将其存储在cookie中
            var claims = new List<Claim>()
            {
            new Claim(ClaimTypes.MobilePhone,model.Mobile),
            new Claim(ClaimTypes.Name,model.UserName),
            new Claim("Id",model.SysNo.ToString())
            };

            //2.创建声明主题 指定认证方式 这里使用cookie
            var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

            //3.配置认证属性 比如过期时间,是否持久化。。。。
            var authProperties = new AuthenticationProperties
            {
                //AllowRefresh = <bool>,
                // Refreshing the authentication session should be allowed.

                //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
                // The time at which the authentication ticket expires. A
                // value set here overrides the ExpireTimeSpan option of
                // CookieAuthenticationOptions set with AddCookie.

                //IsPersistent = true,
                //持久化 ,比如 登录的时候 勾选记住我 复选框

                //IssuedUtc = <DateTimeOffset>,
                //绝对cookie过期

                //RedirectUri = <string>
                // The full path or absolute URI to be used as an http
                // redirect response value.
            };

            //4.登录
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);

            return Result.ResponseSuccess();
        }

SignInAsync 创建一个加密的 cookie ,并将其添加到当前响应中。

退出

退出很简单,主要用户清除cookie

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
获取认证信息

登录之后,我们通常会获取一些声明中的信息,可以使用 HttpContext.User 将会返回一个ClaimsPrincipal对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            ClaimsPrincipal principal = HttpContext.User;
            if (null != principal)
            {
                foreach (Claim claim in principal.Claims)
                {
                    var ii = "CLAIM TYPE: " + claim.Type + "; CLAIM VALUE: " + claim.Value + "</br>";
                }

            }

统一处理获取到的信息,赋值UserViewModel实例CurrentLoginUser

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public class BaseController : Controller
    {
        public UserViewModel CurrentLoginUser
        {
            get
            {
                var principal = HttpContext.User;
                if (principal != null)
                {
                    return new UserViewModel()
                    {
                        UserName = principal.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Name)?.Value,
                        Mobile = principal.Claims.FirstOrDefault(x => x.Type == ClaimTypes.MobilePhone)?.Value,
                        SysNo = new Guid(principal.Claims.FirstOrDefault(x => x.Type == "Id")?.Value ?? Guid.Empty.ToString())
                    };
                }
                return null;
            }
        }

使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      var userId = CurrentLoginUser.SysNo;
startup类配置

在ConfigureServices方法添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
              services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(options =>
                {
                    options.LoginPath =new PathString("/User/Login");

                });

在Configure方法添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            application.UseAuthentication();
            application.UseAuthorization();

参考:

https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/cookie?view=aspnetcore-3.1

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 dotNET知音 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.Net Core系列教程(四)—— 基础身份认证
在ASP.NET 4.5及之前的版本,可以使用FormsAuthenticationTicket来做基础身份认证,现在到了.Net Core中,发现原来的FormsAuthenticationTicket不能用了,其实在.Net Core中,依然可以使用基础身份认证,下面是使用方法。因为这是在具体项目中使用的,会多出一些其他的代码,请自行忽略。
徐大嘴
2019/03/21
2.5K0
.net core 认证与授权(一)
.net core web并不是一个非常新的架构,很多文章提及到认证与授权这个过程,但是一般都会提及到里面的方法怎么用的,而不是模拟一个怎样的过程,所以我打算记录自己的理解。 什么是认证?我们大学毕业有学士证书和毕业证书,来证明你是一个学士。 什么是授权,比如说你被认证是我的朋友后,你可以拿着这个身份,可以进入我的朋友圈看动态。 那么.net core 的认证与授权是一个什么样的过程,在这里提出简单模式是我给你颁发了证书,证明了你的身份,然后呢,你可以拿到你的身份卡之后,你要经过验证,得到授权,然后进入中华人民共和国,就是这个过程。 正文部分均为我的理解,可能存在误差,如果不对请指正。
梁规晓
2020/02/19
6710
.net core 认证与授权(一)
吐槽一下Abp的用户和租户管理模块
聊到基于声明的身份认证将 身份和签发机构分离,应用程序信任签发机构,故认可签发的身份信息。
有态度的马甲
2020/11/09
1.5K0
吐槽一下Abp的用户和租户管理模块
ASP.NET Core 中的自定义身份认证
在 ASP.NET Core 应用开发中,身份认证和授权是保障应用安全的关键环节。虽然 ASP.NET Core 提供了多种内置的身份验证方式(如 Cookie 认证、JWT 认证等),但在某些特定场景下,我们可能需要实现自定义的身份验证和授权策略,以满足独特的业务需求。
郑子铭
2025/03/12
850
ASP.NET Core 中的自定义身份认证
ABP入门系列(10)——扩展AbpSession
源码路径:Github-LearningMpaAbp 一、AbpSession是Session吗? 1、首先来看看它们分别对应的类型是什么? 查看源码发现Session是定义在Controller中的类型为HttpSessionStateBase的属性。 public HttpSessionStateBase Session { get; set; } 再来看看AbpSession是何须类也,咱们定位到AbpController中看一看。 public IAbpSession AbpSession { ge
圣杰
2018/01/11
1.7K0
ABP入门系列(10)——扩展AbpSession
ASP.NET Core Authentication系列(二)实现认证、登录和注销
在上一篇文章介绍ASP.NET Core Authentication的三个重要概念,分别是Claim, ClaimsIdentity, ClaimsPrincipal,以及claims-base authentication是怎么工作的。
梁规晓
2020/11/05
3.4K0
ASP.NET Core Authentication系列(二)实现认证、登录和注销
使用cookie来做身份认证
这里先讲一下Authentication和Authorization两个词的区别。
_淡定_
2018/08/28
3.6K0
实战解读ASP.NET Core身份认证
显而易见,一个常规的身份认证用例包括两部分: ① 对用户进行身份验证 ② 在未经身份验证的用户试图访问受限资源时作出反应
有态度的马甲
2020/10/10
1.8K0
实战解读ASP.NET Core身份认证
【asp.net core 系列】13 Identity 身份验证入门
通过前两篇我们实现了如何在Service层如何访问数据,以及如何运用简单的加密算法对数据加密。这一篇我们将探索如何实现asp.net core的身份验证。
程序员小高
2020/06/24
1K0
在 ASP.NET Core 应用中使用 Cookie 进行身份认证
身份认证是网站最基本的功能,最近因为业务部门的一个需求,需要对一个已经存在很久的小工具网站进行改造,因为在逐步的将一些离散的系统迁移至 .NET Core,所以趁这个机会将这个老的 .NET Framework 4.0 的项目进行升级
程序员宇说
2021/02/04
1.4K0
在 ASP.NET Core 应用中使用 Cookie 进行身份认证
理解ASP.NET Core - Cookie 的身份认证
链接:cnblogs.com/xiaoxiaotank/p/15811749.html
郑子铭
2022/03/22
1K0
理解ASP.NET Core - Cookie 的身份认证
ASP.NET Core Authentication and Authorization
最近把一个Asp .net core 2.0的项目迁移到Asp .net core 3.1,项目启动的时候直接报错:
MJ.Zhou
2020/04/08
1.1K0
ASP.NET Core Authentication and Authorization
ASP.NET Core 中基于 Cookie 的身份鉴权实现
在 ASP.NET Core 应用中,基于 Cookie 的身份鉴权是一种常见的身份验证方式,特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据,从而在用户访问应用的不同页面时保持登录状态。
郑子铭
2025/03/11
510
ASP.NET Core 中基于 Cookie 的身份鉴权实现
ASP.NET Core快速入门(第5章:认证与授权)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore
郑子铭
2021/01/13
1.4K0
ASP.NET Core快速入门(第5章:认证与授权)--学习笔记
asp.net core 3.1多种身份验证方案,cookie和jwt混合认证授权
开发了一个公司内部系统,使用asp.net core 3.1。在开发用户认证授权使用的是简单的cookie认证方式,然后开发好了要写几个接口给其它系统调用数据。并且只是几个简单的接口不准备再重新部署一个站点,所以就直接在MVC的项目里面加了一个API区域用来写接口。这时候因为是接口所以就不能用cookie方式进行认证,得加一个jwt认证,采用多种身份验证方案来进行认证授权。
SpringSun
2020/08/11
5K0
asp.net core 3.1多种身份验证方案,cookie和jwt混合认证授权
【asp.net core 系列】15 自定义Identity
在之前的文章中简单介绍了一下asp.net core中的Identity,这篇文章将继续针对Identity进行进一步的展开。
程序员小高
2020/07/13
8670
ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
认证是一个确定请求访问者真实身份的过程,与认证相关的还有其他两个基本操作——登录和注销。ASP.NET Core利用AuthenticationMiddleware中间件完成针对请求的认证,并提供了用于登录、注销以及“质询”的API,本篇文章利用它们使用最简单的代码实现这些功能。(本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2023/07/10
3040
ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
完美解决asp.net core 3.1 两个AuthenticationScheme(cookie,jwt)共存在一个项目中
在我的项目中有mvc controller(view 和 razor Page)同时也有webapi,那么就需要网站同时支持2种认证方式,web页面的需要传统的cookie认证,webapi则需要使用jwt认证方式,两种默认情况下不能共存,一旦开启了jwt认证,cookie的登录界面都无法使用,原因是jwt是验证http head "Authorization" 这属性.所以连login页面都无法打开.
阿新
2022/05/06
1.3K0
完美解决asp.net core 3.1 两个AuthenticationScheme(cookie,jwt)共存在一个项目中
ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇
在这篇文章中,我将继续ASP.NET Identity 之旅,这也是ASP.NET Identity 三部曲的最后一篇。在本文中,将为大家介绍ASP.NET Identity 的高级功能,它支持声明式并且还可以灵活的与ASP.NET MVC 授权结合使用,同时,它还支持使用第三方来实现身份验证。 关于ASP.NET Identity 的基础知识,请参考如下文章: ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇 ASP.NET MVC 随想录——探索ASP.NET
用户1161731
2018/01/11
2.4K0
ASP.NET MVC 随想录——  使用ASP.NET Identity实现基于声明的授权,高级篇
.Net Core 认证组件之Cookie认证组件解析源码
接着上文.Net Core 认证系统源码解析,Cookie认证算是常用的认证模式,但是目前主流都是前后端分离,有点鸡肋但是,不考虑移动端的站点或者纯管理后台网站可以使用这种认证方式.注意:基于浏览器且不是前后端分离的架构(页面端具有服务端处理能力).移动端就不要考虑了,太麻烦.支持前后端分离前给移动端提供认证Api的一般采用JwtBearer认证,可以和IdentityServer4的password模式结合.很适用,但是id4的password模式各客户端必须绝对信任,因为要暴露用户名密码.适合做企业级下所有产品的认证.不支持除企业外的第三方调用.当然id4提供了其他模式.这是题外话.但是场景得介绍清楚.以免误导大家!
郑小超.
2019/12/30
6080
.Net Core 认证组件之Cookie认证组件解析源码
推荐阅读
相关推荐
.Net Core系列教程(四)—— 基础身份认证
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文