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是如何解决的呢

我们来看一张图

OIDC(Authentication & Authorization)

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

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

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对象转换为字符串保存

  1. {
  2. "alg": "HS256",
  3. "typ": "JWT"
  4. }

Payload

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

  1. {
  2. "sub": "1234567890",
  3. "name": "John Doe",
  4. "iat": 1516239022
  5. }

Signature

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

  1. HMACSHA256(
  2. base64UrlEncode(header) + "." +
  3. base64UrlEncode(payload),
  4. your-256-bit-secret
  5. )

Identity Server 4常用术语

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

    • Allowed Scopes:即可以是Identity Resource,也可以是Api Scopes和Api Resources
  • Resource:您希望使用 IdentityServer 保护的东西,如用户的身份数据或 API。资源名称唯一

    • API Scope:API作用域

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

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

      • User Claims:身份声明,例如sub,name,amr,auth_time等
      • Identity Properties:身份资源本身的一些属性,例如session_id,issued,expired等
      • Identity Grants:被授予的身份信息
    • API Resource:一组API Scope

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

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

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

      • API Grants:被授权的API列表

  • 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:官方翻译是命令式,可以对特定的资源进行授权策略处理

依赖模型

集成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,欢迎联系我们

MASA Auth - SSO与Identity设计的更多相关文章

  1. MASA Auth - 权限设计

    权限术语 Subject:用户,用户组 Action:对Object的操作,如增删改查等 Object:权限作用的对象,也可以理解为资源 Effect:规则的作用,如允许,拒绝 Condition:生 ...

  2. MASA Auth - 从用户的角度看整体设计

    用户 在系统里,用户是一个核心概念.它代表了一个人的唯一身份标识,除了与角色.团队.组织架构等有关,甚至还会影响到在同一个界面不同的用户操作流程与显示内容都会发生变化,再复杂一点的话,或许在同一个系统 ...

  3. 单点登录(SSO)的设计

    一.前言 什么是SSO? SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.https://baike.baidu.c ...

  4. Java VS .NET:Java与.NET的特点对比 单点登录(SSO)的设计

    一.前言 为什么要写Java跟.NET对比? .NET出生之后就带着Java的影子.从模仿到创新,.NET平台也越来越成熟.他们不同的支持者也经常因为孰弱孰强的问题争论不休.但是本文并不是为了一分高下 ...

  5. 单点登录(SSO)的设计与实现

    一.前言 1.SSO说明 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.https://baike.baidu.c ...

  6. ASP.NET MVC SSO单点登录设计与实现

    实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...

  7. ASP.NET MVC SSO单点登录设计与实现(转载)

    实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...

  8. ASP.NET MVC SSO 单点登录设计与实现

    实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...

  9. SSO单点登录设计

    关键字: 单点登录 SSO Session 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用 ...

随机推荐

  1. java中StringTokenizer的用法

    4.StringTokenizer StringTokenizer可以解析分隔符不是空格的情况.例子:import java.util.StringTokenizer;public class Tes ...

  2. potoshop cs6安装配置16错误解决办法(win10系统)

    问题截图如下: 解决方法: 右击图标选择属性:选择兼容性-->兼容模式-->以管理员身份运行-->应用 然后就可以打开了!

  3. 攻防世界——stegano

    分析 1. 一个pdf,里边都是英文. 打开pdf "ctrl + F",检查flag 然活这里边直接告诉你,flag不在这里,一般都这么说了那就是真的不在了. 2. txt打开, ...

  4. 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客?

    前言 OK,我也来造轮子了 博客系统从一开始用WordPress,再到后来用hexo.hugo之类的静态博客生成放github托管,一直在折腾 折腾是为了更好解决问题,最终还是打算自己花时间搞一个好了 ...

  5. 无需debug,通过抽象模型快速梳理代码核心流程

    上一篇我们通过DSM来确定了核心对象并构建了抽象模型.本篇是<如何高效阅读源码>专题的第八篇,我们来基于抽象模型来梳理核心流程. 本节主要内容: 如何通过抽象模型来梳理核心流程 从类名和注 ...

  6. MySQL启动过程详解二:核心模块启动 init_server_components()

    mysqld_main() 函数中,init_server_components() 函数负责MySQL核心模块的启动,包括mdl系统,Innodb存储引擎的启动等等: 1. mdl子系统初始化. 2 ...

  7. Ubuntu 百度飞桨和 CUDA 的安装

    Ubuntu 百度飞桨 和 CUDA 的安装 1.简介 本文主要是 Ubuntu 百度飞桨 和 CUDA 的安装 系统:Ubuntu 20.04 百度飞桨:2.2 为例 2.百度飞桨安装 访问百度飞桨 ...

  8. JMeter配置Oauth2.0授权接口访问

    本文主要介绍如何使用JMeter配置客户端凭证(client credentials)模式下的请求 OAuth2.0介绍 OAuth 2.0 是一种授权机制,主要用来颁发令牌(token) 客户端凭证 ...

  9. 浅谈 TCP、IP、DNS 和 HTTP 的关系

    一.浅谈三个协议的基本概念 1.IP 协议 按层次分,IP网际协议位于网络层,几乎所有的网络的系统都会用到 IP 协议,其重要性非同一般.IP 协议作用就是把各种数据包传送给对方,对方的地址就要看其 ...

  10. Unity—TextMeshPro

    矢量文字,不会因为放大缩小而变的不清晰: 1.TextAsset Window/TextMeshPro/Font Assets Creator 创建TextAsset字体: SourceFont是.t ...