MASA Auth - SSO与Identity设计

AAAA

AAAA即认证、授权、审计、账号(Authentication、Authorization、Audit、Account)。在安全领域我们绕不开的两个问题:

  • 授权过程可靠:让第三方程序能够访问所需资源又不泄露用户数据,常用的多方授权协议主要有 OAuth2 和 SAML 2.0

  • 授权结果可控:授权结果用于功能或资源的访问控制。常见的权限控制模型:DAC、MAC、RBAC、ABAC

    想了解权限控制模型的话可以参照上一篇的权限设计

OpenId(Authentication)

OpenID 是一个以用户为中心的数字身份识别框架,它具有开放、分散性。OpenID 的创建基于这样一个概念:我们可以通过 URI (又叫 URL 或网站地址)来认证一个网站的唯一身份,同理,我们也可以通过这种方式来作为用户的身份认证

对于支持OpenID的网站,用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是,他们只需要预先在一个作为OpenID身份提供者(Identity Provider, IDP)的网站上注册。

OAuth2(Authorization)

举个例子:MASA.Contrib使用codecov来分析单元测试覆盖率,OAuth2帮我解决了几个安全问题:

  • 密码泄露:不需要把账号密码告诉codecov

  • 访问范围:只开放读取源码的能力

  • 权限回收:在Github上撤回授权即可关闭codecov的访问能力

那OAuth2是如何解决的呢

我们来看一张图

36c25d73cf6917d34a229646cc441d22.png

OIDC(Authentication & Authorization)

OpenID Connect 1.0是OAuth 2.0协议之上的一个简单的身份层。它允许客户端基于授权服务器执行的身份验证来验证终端用户的身份,并以一种可互操作的、类似rest的方式获取关于终端用户的基本概要信息。 

5fe264d1532c162d428f6c8c97bbce7e.png

OIDC常用术语

  • EU:End User:终端用户

  • RP:Relying Party,用来代指OAuth2中的受信任的客户端,身份认证和授权信息的消费方

  • OP:OpenID Provider,有能力提供EU认证的服务(比如OAuth2中的授权服务),用来为RP提供EU的身份认证信息

  • ID Token:JWT格式的数据,包含EU身份认证的信息

  • UserInfo Endpoint:用户信息接口(受OAuth2保护),当RP使用Access Token访问时,返回授权用户的信息,此接口必须使用HTTPS

OIDC工作流

  1. RP发送一个认证请求给OP

  2. OP对EU进行身份认证,然后提供授权

  3. OP把ID Token和Access Token(需要的话)返回给RP

  4. RP使用Access Token发送一个请求UserInfo EndPoint

  5. UserInfo EndPoint返回EU的Claims

5a87b357cbcc9031a986b49cd6bda8b7.png

JWT

JWT(JSON Web token)是一个开放的、行业标准的RFC 7519方法,用于在双方之间安全地表示声明。 

JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串

JWT=Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

Header

JWT头是一个描述JWT元数据的JSON对象,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存

{"alg": "HS256","typ": "JWT"
}

Payload

有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据(允许自定义)。

{"sub": "1234567890","name": "John Doe","iat": 1516239022
}

Signature

签名哈希部分是对上面两部分数据签名,需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),your-256-bit-secret
)

Identity Server 4常用术语

  • Client:一个从 IdentityServer 请求令牌的软件——用于验证用户(请求身份令牌)或访问资源(请求访问令牌)。客户端必须先向 IdentityServer 注册,然后才能请求令牌

    • Allowed Scopes:即可以是Identity Resource,也可以是Api Scopes和Api Resources

  • Resource:您希望使用 IdentityServer 保护的东西,如用户的身份数据或 API。资源名称唯一

    • User Claims:需要包含在Access Token中的用户声明列表

    • API Resource Scope:API资源包含的作用域

    • API Properties:API本身的一些属性,例如name, display name, description等

    • API Grants:被授权的API列表

    • User Claims:身份声明,例如sub,name,amr,auth_time等

    • Identity Properties:身份资源本身的一些属性,例如session_id,issued,expired等

    • Identity Grants:被授予的身份信息

    • API Scope:API作用域

      可以当做是Permission来用,示例见:https://docs.duendesoftware.com/identityserver/v6/fundamentals/resources/api_scopes/

    • Identity Resource:关于用户的身份信息(又名声明),例如姓名或电子邮件地址

    • API Resource:一组API Scope

  • Identity Token:身份令牌代表身份验证过程的结果。它至少包含用户的标识符以及有关用户如何以及何时进行身份验证的信息。它可以包含额外的身份数据

  • Access Token:访问令牌允许访问 API 资源。客户端请求访问令牌并将其转发到 API。访问令牌包含有关客户端和用户(如果存在)的信息。API 使用该信息来授权访问其数据

  • Grant Types:授权类型(其实还有Resource owner password,不推荐使用,就不过多介绍了)

    参考自:https://docs.duendesoftware.com/identityserver/v6/overview/terminology/

    • Machine/Robot:Client Credentials

    • Web Applications:Authorization Code With PKCE(Proof Key for Code Exchange)

      通常我们会选择id_token token作为response type

      还有一个选择,就是Implicit。但在隐式流程中,所有令牌都通过浏览器传输,因此不允许刷新令牌等高级功能。作用范围就是仅用于用户身份验证(服务器端和 JavaScript 应用程序),或身份验证和访问令牌请求(JavaScript 应用程序)

    • SPA:Authorization Code With PKCE

    • Native/Mobile Apps:Authorization Code With PKCE

    • TV/Limited Input Device:Device Flow RFC 8628

ASP.Net Core Identity常用术语

  • User:用户

    • Action:操作,包括增删改查

    • User Role:用户角色

    • User Claim:用户声明

  • Role:角色

    • Action:操作,包括增删改查

    • Role Claim:角色声明

  • Claim:声明是一个名称值对,表示使用者是什么,而不是使用者可以做什么。基于声明的授权检查声明的值并允许基于该值的资源访问

  • Policy:策略

    • 默认策略

    • 回退策略

    • 自定义授权属性

    • Require Role:要求角色

    • Require Claim:要求声明

    • Require Assertion:更复杂的可以通过要求断言来解决,它支持两个重载的Func(实际是一个,因为有一个是Task)

    • Requirements:基于IAuthorizationRequirement接口定义一个要求,判断要求要基于AuthorizationHandler<T>来实现对应的逻辑

  • Resource:资源

    • Imperative:官方翻译是命令式,可以对特定的资源进行授权策略处理

依赖模型

f02ad9ffb69a3d99321dbb7e55e0720f.png

集成RBAC

通过.Net Core Identity的User Claimns将User Role与Api Resource、Api Scope、Identity Resource相关联,可以在不同业务维度下获取到用户的角色

再配合ASP.Net Core Identity的Role或Policy进行资源授权判断来达到SSO与RBAC的业务落地

总结

本章节涉及到OIDC、ASP.Net Core Identity和RBAC三部分内容。首先OIDC的知识体系就比较庞大,需要根据比较完善的文档把概念都搞清楚以及为什么这么设计的原因,其次还要进行一些微调把OIDC、RBAC与ASP.Net Core Identity三者结合。可以看出依赖模型其实是个很粗的把各个环节串了起来,但实际落地过程中还免不了对依赖模型进行二次调整来满足不同业务的需求。后续等MASA Auth落地后会再出第三篇文章来回顾和还原实际落地过程。

(本文章不代表最终设计)

开源地址

MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks

MASA.Contrib:https://github.com/masastack/MASA.Contrib

MASA.Utils:https://github.com/masastack/MASA.Utils

MASA.EShop:https://github.com/masalabs/MASA.EShop

MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor

如果你对我们的 MASA Framework 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们

3f6d2f5b5357f45b3270eac7696095be.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter之ConstrainedBox、SizedBox、UnconstrainedBox(尺寸限制类容器)

1 ConstrainedBox、SizedBox、UnconstrainedBox介绍 1)、ConstrainedBox用于对子组件添加额外的约束。例如&#xff0c;如果你想让子组件的最小高度是80像素 ConstrainedBox({Key key,required this.constraints,Widget child,}) 我们可以看到这里有个constraints final BoxC…

网页用数学公式编辑器 可以集成到FCKeditor

网页用数学公式编辑器 可以集成到FCKeditor 公司有个项目是针对学校的&#xff0c;老师希望能在网页里编辑数学公式&#xff0c;找了很多工具都不行&#xff0c;最后只能自己动手了。用了两天的时间弄出了这个东西&#xff0c;希望对大家有用。本程序可以单独使用&#xff0c;…

你真的会玩SQL吗?Case也疯狂

你真的会玩SQL吗&#xff1f;系列目录 你真的会玩SQL吗&#xff1f;之逻辑查询处理阶段 你真的会玩SQL吗&#xff1f;和平大使 内连接、外连接 你真的会玩SQL吗&#xff1f;三范式、数据完整性 你真的会玩SQL吗&#xff1f;查询指定节点及其所有父节点的方法 你真的会玩SQL吗&a…

10个python办公黑科技,助你办公效率提高100倍

1946年&#xff0c;世界上第一台通用计算机“ENIAC”在美国宾夕法尼亚大学诞生&#xff1b;“ENIAC”占地170平方米&#xff0c;重达30吨&#xff0c;耗电功率约150千瓦&#xff0c;每秒钟可进行5000次运算&#xff0c;这个庞然大物用于美国国防部进行弹道计算。 在当时&#…

Flutter之Container

1、Container介绍 我们先看它的构造方法 Container({Key key,this.alignment,this.padding, //容器内补白&#xff0c;属于decoration的装饰范围Color color, // 背景色Decoration decoration, // 背景装饰Decoration foregroundDecoration, //前景装饰double width,//容器的宽…

安卓模拟器获取服务器信息出错,安卓模拟器客户端与服务器不同步

安卓模拟器客户端与服务器不同步 内容精选换一换目前从本地或虚拟机通过DRS备份迁移功能直接迁移到本云RDS for SQL Server实例上&#xff0c;在迁移完成后还需要针对Login账号&#xff0c;DBLink&#xff0c;AgentJOB&#xff0c;关键配置进行识别&#xff0c;并手动完成相关同…

Blazor University (24)路由 —— 可选路由参数

原文链接&#xff1a;https://blazor-university.com/routing/optional-route-parameters/可选路由参数Blazor 不明确支持可选路由参数&#xff0c;但可以通过在组件上添加多个 page 声明轻松实现等效。例如&#xff0c;更改标准 Counter.razor 页面以添加额外的 URL。page &qu…

关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和使用...

关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数 关于session和cookie参考&#xff1a; http://www.blogjava.net/freeman1984/archive/2011/09/02/357833.html http://www.blogjava.net/freeman1984/archive/2010/09/09/331501.html http:…

我让代码生了个孩子继承了他爸爸谁知他爸爸继承了他爷爷(16)

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

linux之lrzsz

1、lrzsz介绍 我们利用lrzsz进行windows和linux间的文件上传下载 2、安装 在ubuntu系统下 sudo apt-get install lrzsz 在centos系统下 yum install lrzsz 3、使用 1)、windows上传文件到linux环境,使用如下命令 rz

Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(2)...

函数load也是实现在文件hardware/libhardware/hardware.c文件中&#xff0c;如下所示&#xff1a; static int load(const char *id, const char *path, const struct hw_module_t **pHmi) { int status; void *handle; struct hw_module_t …

VS2019社区版(Community)试用30天过期的有效解决办法

VS2019社区版是免费的&#xff0c;前提是你得登陆自己的账户&#xff0c;如果一开始安装时没有登陆&#xff0c;那么就会只有30天有效期。此时&#xff0c;需要我们登陆微软账号&#xff0c;重新验证即可。 登陆微软账号&#xff0c;即可继续免费试用。

【万字长文】使用 LSM Tree 思想实现一个 KV 数据库

目录设计思路内存表WALSSTable 的结构SSTable 元素和索引的结构SSTable Tree内存中的 SSTable数据查找过程何为 LSM-Treee参考资料整体结构实现过程文件压缩测试插入测试加载测试查找测试SSTable 结构SSTable 文件结构SSTable Tree 结构和管理 SSTable 文件读取 SSTable 文件SS…

记录部件中GetFieldControlByFieldName(字段值样式设置)用法

度量快速开发平台中&#xff0c;记录部件上&#xff0c;不单是字段名称可以设置样式&#xff0c;要填入内容的方框也可以设置样式。通过获取记录部件上某一个字段的输入控件&#xff0c;在二次开发中不常用。该方法只有一个参数&#xff0c;即要获取对象的字段&#xff0c;需要…

C/C++/Linux工程师学习资料干货路线这都有,从入门到实战!【CSDN宝藏资料图鉴第二期】

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 前言 CSDN 是全球知名的开发者社区&#xff0c;创建于1999年&#xff…

你要的来了:ArcGIS空间插值分析方法权威解读

插值问题的提出??? 一、趋势面 Trend is a global polynomial interpolation that fits a smooth surface defined by a mathematical function (a

Socket解决粘包问题2

在AsynServer中对接收函数增加接收判断&#xff0c;如果收到客户端发送的请求信息&#xff0c;则发送10个测试包给发送端&#xff0c;否则继续接收&#xff0c;修改后的接收代码如下&#xff1a; private void AsynReceive(){byte[] data new byte[1024];//接收缓存string rec…

保姆级的HTML零基础教程少见吧?这是第一节(1)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

WPF 通用权限开发框架 (ABP)

前言对于大部分.NET 开发者来说, 都比较熟悉目前流行的ABP框架, 基于开源的ABP框架, 可以自己进行二次开发, 无需重新开发一些基础功能,例如: 用户角色管理、权限、组织、多租户等等。但是对于ABP框架来说, 提供给.NET开发者的可选项非常少, 目前也仅仅是提供了基于Web的解决方…

MongoDB 3.0 新增特性一览

引言 在历经版本号修改&#xff08;2.8版本直接跳到3.0版本&#xff09;和11个rc版本之后&#xff0c;MongoDB3.0于2015年3月3日正式发布。可以毫不夸张的说&#xff0c;该版本的新增特性标志着MongoDB这款典型的NoSQL数据库已经进入了一个全新的发展阶段。本文以下内容会逐个盘…