IdentityServer4【Topic】之定义资源
Defining Resources 定义资源
你在系统中通常定义的第一件事是你想要保护的资源。这可能是你的用户的身份信息,比如个人资料数据或电子邮件地址,或者访问api。
你可以通过C#对象模型(内存中的)--或者加载数据库资源(数据库中的)来定义资源。一个IResouceStore的实现来处理这些底层的细节。对于这篇文档来说我们使用的是基于内存中的实现。
Defining identity resources 定义IdentityResource
一个用户的ID、名字、邮件地址等这些信息,都可以看成是资源,有一个更好的名字是Identity resource,还有一个api resource,后面会讲。这两种都被IdentityServer4当作了资源。一个是用户范畴的,另一个是api范畴的。一个Identity resource有一个唯一的名字作为标识符,并且你可以给一个identity resource赋予任意类型的声明(claim)类型。这些声明(claim)之后会被包含在一个Identity token(ID token)中。第三方的客户端使用”scope“这个参数来请求一个identity resource。
OpenID Connect规范中制定了一些标准的identity resource。最基本的要求是你为你的用户放出一个唯一的ID,这个ID通常也叫做subject id。这个过程是通过暴露一个叫做openid的标准identity resource来完成的。
public static IEnumerable<IdentityResource> GetIdentityResources()
{
return new List<IdentityResource>
{
new IdentityResources.OpenId()
};
}
IdentityResources类(注意是复数)涵盖了规范中(上面提到的)定义了的所有范围(openid、email、profile、telephone和address)如果想要支持他们,就在方法中进行引入:
public static IEnumerable<IdentityResource> GetIdentityResources()
{
return new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Email(),
new IdentityResources.Profile(),
new IdentityResources.Phone(),
new IdentityResources.Address()
};
}
Defining custom identity resources 定义自定义的Identity Resource
你当然可以定义自定义的Identity Resource。通过new创建一个IdentityResource的类实例,给它一个名字和一些其他的选项比如displayname、description等等并且当这个resource被请求时定义哪些claim可以被包含进Identity token里面。
public static IEnumerable<IdentityResource> GetIdentityResources()
{
var customProfile = new IdentityResource(
name: "custom.profile",
displayName: "Custom profile",
claimTypes: new[] { "name", "email", "status" }); return new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Profile(),
customProfile
};
}
通过这里查看关于IdentityResource的更多信息。
Defining API resources 定义ApiResource
如果要允许第三方客户端请求access token(访问令牌)并以此访问客户端,你需要定义ApiResource(api资源),例如:
为了获得访问api的access token(访问令牌),您还需要将它们注册为一个范围(scope)。这一次,范围类型是资源:
public static IEnumerable<ApiResource> GetApis()
{
return new[]
{
//简单的API只有一个scope(下面这个代码中的scope名称就和ApiResource的名称是一样的)
new ApiResource("api1", "Some API 1"), // 扩展版本:如果你需要更多的控制
new ApiResource
{
Name = "api2", // 使用introspection endpoint的密钥
ApiSecrets =
{
new Secret("secret".Sha256())
}, // 下面的代码会在访问令牌(access token)中增加除了subject id以外其他的用户声明(claim)
UserClaims = { JwtClaimTypes.Name, JwtClaimTypes.Email }, // 这个ApiResource定义了两个scope
Scopes =
{
new Scope()
{
Name = "api2.full_access",
DisplayName = "Full access to API 2",
},
new Scope
{
Name = "api2.read_only",
DisplayName = "Read only access to API 2"
}
}
}
};
}
点击这里查看更多关于ApiResource的信息.
注意:ApiResource中定义的UesrClaims属性可以由IProfileService这个扩展点来加载(也就是可以加载一些我们自定义的声明)。
IdentityServer4【Topic】之定义资源的更多相关文章
- IdentityServer Topics(2)- 定义资源
您通常在系统设计中的第一件事就是您要保护的资源. 这可能是您的用户的身份信息,如个人资料数据或电子邮件地址,或访问API. 您可以使用C#对象模型定义资源(硬编码),或从数据存储中加载它们. IRes ...
- 第19章 定义资源 - Identity Server 4 中文文档(v1.0.0)
您通常在系统中定义的第一件事是您要保护的资源.这可能是您的用户的身份信息,如个人资料数据或电子邮件地址,或访问API. 注意 您可以使用C#对象模型定义资源 - 或从数据存储加载它们.IResourc ...
- Spring技术内幕_IOC容器载入Bean定义资源文件
转自:http://blog.csdn.net/chjttony/article/details/6259723 1.当spring的IoC容器将Bean定义的资源文件封装为Spring的Resour ...
- (3)puppet清单定义资源的语法
1.先看两个例子: a.创建一个文件 file{"/tmp/12567.txt": content => aaaaababbau, ensure => present ...
- 基于IdentityServer4的单点登录——IdentityServer
1.新建项目并添加引用 新建一个asp .net core 2.0的项目引用IdentityServer4.AspNetIdentity 2.定义资源 新建Config.cs文件,定义Api资源与Id ...
- kubernetes系列06—kubernetes资源清单定义入门
本文收录在容器技术学习系列文章总目录 1.认识kubernetes资源 1.1 常用资源/对象 workload工作负载型资源:pod,ReplicaSet,Deployment,StatefulSe ...
- Kubenetes 资源清单定义入门
Kubernetes 常用资源 资源 对象 工作负载型资源对象(workload): Pod Replicaset ReplicationController Deployments Stat ...
- Kubernetes学习之路(十)之资源清单定义
一.Kubernetes常用资源 以下列举的内容都是 kubernetes 中的 Object,这些对象都可以在 yaml 文件中作为一种 API 类型来配置. 类别 名称 工作负载型资源对象 Pod ...
- 在独立的文件里定义WPF资源
一.文章概述 本演示介绍怎样在单独的文件里定义WPF资源.并在须要的地方调用相关资源文件. 相关下载(代码.屏幕录像):http://pan.baidu.com/s/1sjO7StB 在线播放:htt ...
随机推荐
- C语言 投票系统:给定候选人,从键盘输入候选人的名字,统计票数,并输出最终获胜者
投票系统:给定候选人名单,从键盘输入候选人的名字,统计票数,并输出最终获胜者.若投票人输入的名字不在其候选名单上,则该票数无效. //凯鲁嘎吉 - 博客园 http://www.cnblogs.com ...
- 【Teradata Utility】系统工具使用
List two ways in which a system utility can be started. Explain how to use the following utilities t ...
- ZooKeeper Observers解决节点过多时写性能下降问题
ZooKeeper Observers Observers: Scaling ZooKeeper Without Hurting Write Performance How to use Observ ...
- python之常用模块(续)
time模块 random模块 sys模块 os模块 序列化模块 time模块 有三种方式表示 在Python中,通常有三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串 ...
- 试验一下Golang 网络爬虫框架gocolly/colly
参考:http://www.cnblogs.com/majianguo/p/8186429.html 框架源码在 github.com/gocolly/colly 代码如下(github源码中的dem ...
- Leetcode:0027
Leetcode:0027 题目:给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组并在使用 ...
- Java序列化由于没有指定serialVersionUID导致报错
z.JobPersistenceException: Couldn't retrieve job because the BLOB couldn't be deserialized: com.mode ...
- 【转】Android动态破解微信本地数据库(EnMicroMsg.db)
最近在公司接了一个任务,需要在几百台手机上安装一个app,目的是获取微信里面的通讯录,并且定时的把他发送到我们的服务器上.当时依次尝试的如下几个方案: 1.通过群控,将好友截图发送到服务端(pytho ...
- PHP小接
一种是innodb,一种是myisam,两者的主要区别是①myisam不支持事务处理,而innoDB支持事务处理 ②myisam 不支持外键,innoDB支持外键 ③myisam支持全文检索,而inn ...
- mybatis错误之org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
玩了MyBatis差不多有两年了,中间也玩过MyBatis-Plus,这个MyBatis-Plus其实与MyBatis的区别并不大.今天写博客业务代码的时候,犯一个初学者犯过的错误. 错误信息如下:o ...