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. MySQL 数据库操作指南:LIMIT,OFFSET 和 JOIN 的使用

    限制结果 您可以通过使用"LIMIT"语句来限制查询返回的记录数量.以下是一个示例,获取您自己的Python服务器中"customers"表中的前5条记录: i ...

  2. 【编译原理】Antlr 入门使用

    前面文章我们学习了编译器前端的词法和语法分析工具,本篇我们来看看如何借助 Antlr 工具,快速生成词法和语法分析代码. 一.安装 mac 环境: 1)安装 brew install antlr 2) ...

  3. webpack 配置热更新

    正文 代码 const path=require('path'); module.exports={ devtool:'', entry:{ entry:'./src/entry.js', entry ...

  4. 4A 安全之授权:编程的门禁,你能解开吗?

    概述 在安全管理系统里面,授权(Authorization)的概念常常是和认证(Authentication).账号(Account)和审计(Audit)一起出现的,并称之为 4A.就像上一文章提到的 ...

  5. Web前端 -- 利用Babel来将ES6转化为ES5代码

    一.简介 Babel用来将ES6代码转为ES5代码. 二.安装 安装命令行转码工具 Babel提供babel-cli工具,用于命令行转码.它的安装命令如下: npm install --global ...

  6. 当 mysql-connector-java-5 遇上 MySQL8,终究还是错付了 → 门当户对真的很重要!

    开心一刻 今天,老婆给我发消息 老婆:老公,儿子从隔壁邻居家回来了 老婆:是先打还是先洗? 我:先洗吧,万一打错人了呢 老婆:先洗脸吧,没错就边打边洗 起因 在我们的固有认知中, mysql-conn ...

  7. 力扣6(java)-Z字形变换(中等)

    题目: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如 ...

  8. 阿里巴巴开源大规模稀疏模型训练/预测引擎DeepRec

    ​简介:经历6年时间,在各团队的努力下,阿里巴巴集团大规模稀疏模型训练/预测引擎DeepRec正式对外开源,助力开发者提升稀疏模型训练性能和效果. ​ 作者 | 烟秋 来源 | 阿里技术公众号 经历6 ...

  9. Dataphin核心功能(四):安全——基于数据权限分类分级和敏感数据保护,保障企业数据安全

    简介:<数据安全法>的发布,对企业的数据安全使用和管理提出了更高的要求.Dataphin提供基于数据分级分类和数据脱敏的敏感数据识别和保护能力,助力企业建立合规的数据安全体系,保障企业数据 ...

  10. 使用 Flink Hudi 构建流式数据湖

    ​简介: 本文介绍了 Flink Hudi 通过流计算对原有基于 mini-batch 的增量计算模型的不断优化演进. 本文介绍了 Flink Hudi 通过流计算对原有基于 mini-batch 的 ...