HTTP身份认证框架

RFC 7235 定义了一个 HTTP 身份验证框架,服务器可以用来质询(challenge)客户端的请求,客户端则可以提供身份验证凭据。

服务端开启了身份认证后。如果客户端访问未授权的接口,服务器端会向客户端返回 401(Unauthorized,未被授权的)响应状态码,并在 WWW-Authenticate 响应标头提供如何进行验证的信息,其中至少包含有一种质询方式。

标头的语法如下

WWW-Authenticate: <type> realm=<realm>

在这里,<type> 指的是验证的方案(“Basic”是最常见的验证方案)。realm 用来描述进行保护的区域,或者指代保护的范围(相当于一个角色)

要正常访问,就要添加身份认证标头

Authorization: <type> <credentials>
<type>指的是身份认证框架使用的身份认证方案,比如basic 参见 RFC 7617,base64 编码凭据。“Basic”HTTP 验证方案是在 RFC 7617 中规定的,在该方案中,使用用户的 ID/密码作为凭据信息,并且使用 base64 算法进行编码,以明文的形式在网络中进行传输的。
<credentials>如果是basic验证,在前端就用js生成就行,如果是bearer,一般是请求后端的登录接口获取,或者是问后端人员要一个。
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

在这个示例中,QWxhZGRpbjpvcGVuIHNlc2FtZQ== 是用户名和密码经过 Base64 编码后的结果。这个字符串的解码结果是 Aladdin:open sesame。Aladdin是用户名,open sesame是密码。

bearer 参见 RFC 6750,bearer 令牌通过 OAuth 2.0 保护资源
Authorization: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Ind3dy5iZWpzb24uY29tIiwic3ViIjoiZGVtbyIsImlhdCI6MTcxNDQ0NjQ0MiwibmJmIjoxNzE0NDQ2NDQyLCJleHAiOjE3MTQ1MzI4NDJ9.8bg2jMRwkbSoEkLZrjoko4zREFjxmkHPOrTCdTkOwK8

这个例子解密如下

如果没有该标头的话,会报401错误,并提示你应该使用的身份认证方案

web主机配置身份认证

web主机中配置

 1 builder.Services.AddAuthentication(option =>
2 {
3 //添加一个使用 JwtBearer 身份验证作为默认的身份验证方案,不是这里开启了身份认证
4 option.DefaultAuthenticateScheme= JwtBearerDefaults.AuthenticationScheme;
5 option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
6 }).AddJwtBearer(option =>
7 {
8 option.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
9 {
10 ValidIssuer = "颁发机构",
11 ValidAudience = "申请者",
12 //ValidateLifetime=true,//验证失效时间,默认就是true
13 ClockSkew=TimeSpan.FromSeconds(0),//将token的失效时间延长,默认是5分钟
14 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("1234567890123456颁发者数字签名"))//最小16位
15 };
16 });
17 //添加授权策略,不指定策略,使用默认策略时,可注释
18 //builder.Services.AddAuthorization(option =>
19 //{
20 // // 这里可以定义多个策略
21 // //option.AddPolicy("DefaultPolicy", policy =>
22 // //{
23 // // policy.RequireAuthenticatedUser();// 要求用户认证
24 // //});
25 //});
26 builder.Services.AddControllers(option =>
27 {
28 //给控制器应用授权策略(过时的方式,现在推荐使用端点路由授权)
29 //option.Filters.Add(new AuthorizeFilter());
30 });
31
32 var app = builder.Build();
33
34 //开启身份验证。对于授权不是必须的,如果不使用HttpContext.User,可注释。如果验证成功,处理程序将创建一个表示用户身份的ClaimsPrincipal对象,并将其设置为当前HTTP上下文的用户(HttpContext.User),否则返回401
35 //app.UseAuthentication();
36 //开启授权。必须在身份验证之后。启用授权组件[Authorize]。但是对于使用过滤器的方式授权,此中间件不需要也可以
37 app.UseAuthorization();
38 //推荐使用的全局授权方式。使用请求端点路由的方式授权,不指定具体授权策略时会使用默认策略
39 app.MapControllers().RequireAuthorization();
40
41 app.Run();

Authorization表头需要的token生成

 1 Claim[] claim = new Claim[] {
2 new Claim(ClaimTypes.Name,"zzz"),
3 new Claim("testdepart","testdepart"),
4 new Claim("自定义字段","testdepart")
5 };
6 var token = new JwtSecurityToken(
7 issuer: "颁发机构",
8 audience: "申请者",
9 claims: claim,
10 notBefore: DateTime.Now,
11 expires: DateTime.Now.AddMinutes(1),
12 signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes("1234567890123456颁发者数字签名")), SecurityAlgorithms.HmacSha256));
13 string jwttoken=new JwtSecurityTokenHandler().WriteToken(token);

注意的事项:身份验证和授权在前端请求看来是一件事,就是添加一个Authorization标头,但对于后端web主机是两件事,不一定要全部都做。

添加身份认证和鉴权方案-使用jwtbearer的更多相关文章

  1. spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法

    spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...

  2. ASP.NET Core 项目简单实现身份验证及鉴权

    ASP.NET Core 身份验证及鉴权 目录 项目准备 身份验证 定义基本类型和接口 编写验证处理器 实现用户身份验证 权限鉴定 思路 编写过滤器类及相关接口 实现属性注入 实现用户权限鉴定 测试 ...

  3. Tomcat 容器的安全认证和鉴权

    大量的 Web 应用都有安全相关的需求,正因如此,Servlet 规范建议容器要有满足这些需求的机制和基础设施,所以容器要对以下安全特性予以支持: 身份验证:验证授权用户的用户名和密码 资源访问控制: ...

  4. 深入理解k8s中的访问控制(认证、鉴权、审计)流程

    Kubernetes自身并没有用户管理能力,无法像操作Pod一样,通过API的方式创建/删除一个用户实例,也无法在etcd中找到用户对应的存储对象. 在Kubernetes的访问控制流程中,用户模型是 ...

  5. shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃

    这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...

  6. web系统认证与鉴权中的一些问题

    认证鉴权系统的初心: 空间管理: 1.他是谁? 他登陆了没有? 2.他要做什么? 2.1 他要使用什么功能? 他是否有这个功能的权限. 2.2 他要使用这个功能做什么操作? 他是否有这个功能的这个操作 ...

  7. Java架构笔记:用JWT对SpringCloud进行认证和鉴权

    写在前面 喜欢的朋友可以关注下专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. image.png JWT(JSON WEB TOKEN)是基于RF ...

  8. 【Python】Django用户、认证、鉴权模块使用

    此文是总结Django官方网站里面的Document的文章 User authentication in Django http://www.djangoproject.com/documentati ...

  9. 白话OAuth2用户认证及鉴权标准流程

    一.OAuth2需求场景 在说明OAuth2需求及使用场景之前,需要先介绍一下OAuth2授权流程中的各种角色: 资源拥有者(User) - 指应用的用户 认证服务器 (Authorization S ...

  10. 认证鉴权与API权限控制在微服务架构中的设计与实现(四)

    引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的完结篇,前面三篇已经将认证鉴权与API权限控制的流程和主要细节讲解完.本文比较长,对这个系列进行收尾,主要内容包括 ...

随机推荐

  1. OpenHarmony 4.1 Release版本正式发布,邀您体验

    春风轻拂的4月,OpenAtom OpenHarmony(以下简称"OpenHarmony")4.1 Release版本如期而至,开发套件同步升级到API 11 Release. ...

  2. CircleIndicator组件,使指示器风格更加多样化

    UI界面是应用程序可视化必不可少的部分.设计精致的UI界面可以使得整个可视化应用程序给用户留下深刻的印象,是改善用户界面体验最直接的方式. ArkUI开发框架为开发者提供了丰富的UI原生组件,如Nav ...

  3. Python 中的数字类型与转换技巧

    Python中有三种数字类型: int(整数) float(浮点数) complex(复数) 当您将值分配给变量时,将创建数字类型的变量: 示例:获取您自己的Python服务器 x = 1 # int ...

  4. MogDB/openGauss学习笔记-获取对象DDL

    MogDB/openGauss 学习笔记-获取对象 DDL 本文出处:https://www.modb.pro/db/399230 内置函数 omm2=# \df *def List of funct ...

  5. HarmonyOS 设备管理开发:USB 服务开发指导

      基本概念 USB服务是应用访问底层的一种设备抽象概念.开发者根据提供的USB API,可以获取设备列表.控制设备访问权限.以及与连接的设备进行数据传输.控制命令传输等. 运作机制 USB服务系统包 ...

  6. 在python中实现二叉树

    二叉树设计 定义节点类 class Node: # 修改初始化方法 def init(self,value): self.value = value # 节点值 self.left = None # ...

  7. 行业软件开发商怎样来抢 BI 这块蛋糕?

    随着企业信息化建设的深入,很多机构的生产系统已建设完成,在保证生产的有序进行后,如何更有效地进行经营决策成了管理者面临的最大任务.商业智能(BI)就是在这种背景成为支撑企业经营分析的一大利器. 根据 ...

  8. ping 介绍

    前言 因为要整理网络这一块,所以打算先把概念写下.这节介绍ping的实现原理. 正文 先看一下图: 又没有发现和我们的icmp很像?对头.在icmp中,我写道:icmp有两种报文,一种是差错报文,一种 ...

  9. MySQL—MySQL架构

    MySQL-MySQL架构 MySQL逻辑架构图如下: Connectors连接器:负责跟客户端建立连接: Management Serveices & Utilities系统管理和控制工具: ...

  10. Python Flask获取iOS的UDID

    测试iOS app时候,我们可以安装以下4种类型的包 : AdHoc                 -- 一般为正式环境验证AppStore             -- 上传AppStore,只有 ...