这篇文章基于https://leastprivilege.com/2016/12/01/new-in-identityserver4-resource-based-configuration/进行翻译,解释了IdentityServer4中关于资源(Rerource)的原理。

以下是一些涉及到的术语和翻译的映射关系:

客户端---client

资源---Resource

作用域/范围---Scope

Api资源---ApiResource

Identity资源/身份资源---IdentityResource

原文的题目为New in IdentityServer4: Resource-based Configuration,Resource是对于Scope这个概念的进一步抽象。以下为翻译,需要注意的是Scope被翻译为作用域,Resource被翻译成资源。但有一些地方我为了清楚的表示出其中的术语,还是会有意的在小括号中标记出相关的单词。

对于RC4(早前IdentityServer4的一个预览版本),我们决定为资源(以前称为作用域)重新设计配置对象模型。

我知道,我知道——我们不应该在达到RC状态后做出根本性的突破性的改变——但是,嘿——我们有了“DNX”时刻,意识到我们要么现在改变,要么永远不改变。

我们为啥要这么干?

在过去的几年里,我们花了大量的时间向数百名参加培训班的学生、会议的与会者、开发人员以及来自各行各业的客户解释OpenID Connect和基于OAuth 2.0的体系结构。

虽然大多数概念都非常清楚,而且完全有意义,但是对于大多数人来说,作用域是最容易混淆的部分。作用域的抽象本质,以及术语Scope在OpenID Connect和OAuth 2.0中的含义有所不同,使得这个概念很难理解。

也许部分原因是我们的错误,我们在对待对象模型和抽象(接口)层面上保持了比较相近的概念(意思是说之前建立的这个接口或抽象还是有一些抽象,不确切),同时,我们将这个概念强加给了IdentityServer的每个用户。

长话短说——每次我需要解释Scope时,我都会说“Scope是客户想要访问的资源”之类的话。“有两种类型的Scope:与标识(就是现在的IdentityResource)相关的Scope和api(就是现在的ApiResource)……”

这让我们思考在IdentityServer中引入资源(resource)的概念,并去掉作用域(Scope)是否更有意义。

我们干了啥?

在RC4之前——我们的配置对象模型有三个主要部分:用户、客户端和作用域(Scope)(作用域有两种类型——标识和资源——以及它们之间的一些重叠设置)。

从RC4开始——配置模型不再是顶级概念,取而代之的是身份资源和API资源。

我们认为这是一种更自然的方式(和语言)来建模一个典型的基于令牌的系统(token-based system)。

在我们新的文档中:

1、用户


用户是一个使用已注册的客户端(client)访问资源的人类。

2、客户端

客户端是一个软件,它从IdentityServer(认证服务器)请求令牌——用于对用户进行身份验证(请求标识令牌,id_token)

或用于访问资源(请求访问令牌,access_token)。客户机必须首先在IdentityServer注册,然后才能请求令牌。

3、资源

资源是你利用IdentityServer(认证服务器)进行保护的对象,也就是说它是一种被保护的东西。它可以是用户的信息(比如名字、电话、生日等)或者是API。

talk is cheap,show me the code,我们怎么干的?

在RC4之前,你可能会使用作用域(Scope)存储来返回作用域的平面列表(意思就是一个List<Scope>里面即放了关于API的Scope,又放了关于身份标识的Scope)。现在新的资源存储处理两种不同的资源类型:IdentityResource和ApiResource。

让我们从Identityresource开始--标准的Scope定义的关于Identity的Scope列表如下:‘

public static IEnumerable<Scope> GetIdentityScopes()
{
return new List<Scope>
{
StandardScopes.OpenId,
StandardScopes.Profile
};
}

上面那种换成新的写法如下:

public static IEnumerable<IdentityResource> GetIdentityResources()
{
return new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Profile()
};
}

也没啥大不一样的地方,现在,让我们用相关的Claims声明来定义一些IdentityResource:

var customerProfile = new IdentityResource(
name: "profile.customer",
displayName: "Customer profile",
claimTypes: new[] { "name", "status", "location" });

以上这样的定义就会使用于90%的场景。如果需要调整细节,可以在IdentityResource类上设置各种属性。

然后再来看看ApiResource,之前你需要像下面这种的定义一个Api的Scope列表:

public static IEnumerable<Scope> GetScopes()
{
return new List<Scope>
{
new Scope
{
Name = "api1",
DisplayName = "My API #1", Type = ScopeType.Resource
}
};
}

现在是这样:

public static IEnumerable<ApiResource> GetApis()
{
return new[]
{
new ApiResource("api1", "My API #1")
};
}

同样,对于简单的情况,没有太大的区别。当你有一些高级需求时,比如具有多个作用域的api(可能根据作用域(Scope)有不同的声明(Claim))和对自省/反射(introspection)的支持时,ApiResource对象模型开始变得更加强大,例如:

public static IEnumerable<ApiResource> GetApis()
{
return new[]
{
new ApiResource
{
Name = "calendar", // secret for introspection endpoint
ApiSecrets =
{
new Secret("secret".Sha256())
}, // claims to include in access token
UserClaims =
{
JwtClaimTypes.Name,
JwtClaimTypes.Email
}, // API has multiple scopes
Scopes =
{
new Scope
{
Name = "calendar.read_only",
DisplayName = "Read only access to the calendar"
},
new Scope
{
Name = "calendar.full_access",
DisplayName = "Full access to the calendar",
Emphasize = true, // include additional claim for that scope
UserClaims =
{
"status"
}
}
}
};
}

我们颠倒了配置方法,现在你建模的是API(可能有作用域),而不是作用域(刚好表示API)。

我们更喜欢新模型,因为它反映了如何更好地构建基于令牌的系统。我们希望你也喜欢它;)

【翻译】IdentityServer4:基于资源的配置的更多相关文章

  1. 大型网站的 HTTPS 实践(三)——基于协议和配置的优化

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt389 1 前言 上文讲到 HTTPS 对用户访问速度的影响. 本文就为大家介 ...

  2. 13.翻译系列:Code-First方式配置多对多关系【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code- ...

  3. 8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)

    原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx EF 6 Cod ...

  4. 滥用基于资源约束委派来攻击Active Directory

    0x00 前言 早在2018年3月前,我就开始了一场毫无意义的争论,以证明TrustedToAuthForDelegation属性是无意义的,并且可以在没有该属性的情况下实现“协议转换”.我相信,只要 ...

  5. 权限管理系统(五):RBAC新解,基于资源的权限管理

    本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的.同时我将讨论一种我认为更好的权限管理方式. 1.什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念.角色是 ...

  6. HTTPS 性能优化 -- 基于协议和配置的优化

    基于协议和配置的优化 1 前言 上文讲到 HTTPS 对用户访问速度的影响. 本文就为大家介绍 HTTPS 在访问速度,计算性能,安全等方面基于协议和配置的优化. 2 HTTPS 访问速度优化 2.1 ...

  7. Spring框架入门之基于Java注解配置bean

    Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...

  8. Spring Security入门(基于SSM环境配置)

    一.前期准备 配置SSM环境 二.不使用数据库进行权限控制 配置好SSM环境以后,配置SpringSecurity环境 添加security依赖   <dependency> <gr ...

  9. YOLOv4 资源环境配置和测试样例效果

    YOLOv4 资源环境配置和测试样例效果 基本环境:cuda=10.0,cudnn>=7.0, opencv>=2.4 一.下载yolov4 git clone https://githu ...

随机推荐

  1. git合并两个不同的仓库

    目前开发是2个仓库,线上仓库online_a(对应的branch分支为online),测试环境online_b(对应的branch分支为demo),测试环境需要时刻保持onine_a上的最新稳定稳定代 ...

  2. 2018.12/6 js键盘事件 DOM:0级2级

    DOM0级事件元素绑定多个click最后只执行最后一个click. DOM2级事件元素绑定多个click,都要执行 注意当绑定的多个事件名,函数名,事件发生阶段三者完全一样时,才执行最后一个 div. ...

  3. C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】

    一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...

  4. 设计模式之解释器模式——Java语言描述

    解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文.这种模式被用在SQL解析.符号处理引擎等 介绍 意图 给定一个语言,定义它的文 ...

  5. 页面内容不够高footer始终位于页面的最底部

    相信很多前端工程师在开发页面时会遇到这个情况:当整个页面高度不足以占满显示屏一屏,页脚不是在页面最底部,用户视觉上会有点不好看,想让页脚始终在页面最底部,我们可能会想到用: 1.min-height来 ...

  6. vis.js 4.21.0 Timeline localization

    from:http://visjs.org/timeline_examples.html https://github.com/almende/vis https://github.com/momen ...

  7. nginx在代理转发地图瓦片数据中的应用

    最近有这样一个需求,需要将arcgis server发布的地图瓦片放在移动硬盘中,系统演示的时候,直接调用本地的地图瓦片,而非远程的,主要是为了系统演示的时候加快地图访问速度. 而且需要在任意电脑运行 ...

  8. Java实现栈数据结构

    栈(英语:stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型,其特殊之处在于只能允许在链表或数组的一端(称为堆栈顶端指针,英语:top)进行加入数据(英语:push)和输出数据 ...

  9. C# Tostring()方法

    在C#中 JArray japroimg = new JArray(); strproimg.ToString();这样会导致tostring之后的字符串中会有大量的空格 使用  japroimg.T ...

  10. 简说raid1 raid2 raid5 raid6 raid10的优缺点和做各自raid需要几块硬盘

    Raid 0:一块硬盘或者以上就可做raid0优势:数据读取写入最快,最大优势提高硬盘容量,比如3快80G的硬盘做raid0 可用总容量为240G.速度是一样.缺点:无冗余能力,一块硬盘损坏,数据全无 ...