Oauth 2.0 Open Id Connect-Identity Server 4//如何将特定用户授予具体作用域?
看完开放Id文档后,我有一些疑问。任何帮助都将不胜感激 在任何一个oidc流之后,您都将拥有一个id_令牌和一个access_令牌 a) 当您将access_令牌发送到受保护的api时,它为什么或何时(例如)需要检索有关拥有它的用户的一些声明?如果受保护的api想要使用一些关于经过身份验证的用户的数据 b) 为了获得声明,受保护的api需要与UserEdnpoint端点通信? 它发送访问令牌? 返回的id_令牌中包含哪些声明?/如果它要求更多声明用户具有同意访问权限,会发生什么情况 c) Identity server 4:定义要保护的资源。它们可以是“标识资源”和“api资源”。在定义ApiResources时,您可以在细粒度范围内定义。例如:Oauth 2.0 Open Id Connect-Identity Server 4//如何将特定用户授予具体作用域?,oauth-2.0,openid,identityserver4,openid-connect,Oauth 2.0,Openid,Identityserver4,Openid Connect,看完开放Id文档后,我有一些疑问。任何帮助都将不胜感激 在任何一个oidc流之后,您都将拥有一个id_令牌和一个access_令牌 a) 当您将access_令牌发送到受保护的api时,它为什么或何时(例如)需要检索有关拥有它的用户的一些声明?如果受保护的api想要使用一些关于经过身份验证的用户的数据 b) 为了获得声明,受保护的api需要与UserEdnpoint端点通信? 它发送访问令牌? 返回的id_令牌中包含哪些声明?/如果它要求更多声明用户具有同意访问权限,会发生什么情况 c) Ide
Scopes =
{
new Scope()
{
Name = "weather.api.full_access",
DisplayName = "Full access to WEATHER API",
},
new Scope
{
Name = "weather.api.read_only",
DisplayName = "Read only access to WEATHER API"
}
}
您还可以定义客户端以及它们可以访问哪些作用域。
您如何指定哪些用户可以访问特定资源?我看不出您将如何映射使用同一客户端的用户的特定权限
这些步骤将是:
“OrganizationID”
或“departmentid
”并将该声明及其值添加到已发行的令牌中。这是否适用,将取决于您的问题背景,并且当在身份验证中错误地试图解决授权问题时,存在一条细微的界限
b) 为了获得声明,受保护的api需要与UserEdnpoint端点通信?它发送访问令牌?返回的id_令牌中包含哪些声明?/如果它要求更多声明用户具有同意访问权限,会发生什么情况
您不必使用UserInfo端点。您可以将客户端属性AlwaysIncludeUserClaimsInIdToken
设置为true,默认情况下,所有声明都将包含在id\u令牌中,因此无需往返到UserInfo端点。如果您最终选择往返,您说您需要发送代表用户的access\u令牌
,这是正确的,但是,返回的不是id\u令牌
,而是用户信息。
示例来自:
请求:获取/连接/用户信息
授权:承载{access_token}
答复:HTTP/1.1200正常
内容类型:application/json
{
“sub”:“248289761001”,
“姓名”:“鲍勃·史密斯”,
“给定名称”:“Bob”,
“姓氏”:“史密斯”,
“作用”:[
“用户”,
“管理员”
]}
最后
您如何指定哪些用户可以访问特定资源
这很可能是通过授权来解决的,授权与OAuth2协议或IdentityServer 4无关<代码>授权
通常在每个应用程序中根据问题域的需要进行不同的处理。我建议大家看看Identity Server的创建者。他们有一个很好的视频,深入探讨了这个主题,他们也有一个产品来解决这个问题。IdentityServer有三个部分:
API资源配置
标识资源配置
用户信息(索赔)
有两个令牌:访问令牌和标识令牌。访问令牌用于访问资源(api和UserInfo端点),标识令牌包含有关用户的信息
虽然IdentityServer负责对用户进行身份验证,但它还包含授权配置。您可以使用PolicyServer之类的工具将授权从IdentityServer中删除,但对于基本授权,您不必这样做
有两种类型的用户声明:
关于用户是谁的声明,如姓名、性别、生日等
声明用户的权限,如角色、员工ID等
第一组声明是身份令牌的一部分,告诉客户端用户是谁,其他声明是访问令牌的一部分,告诉API允许用户做什么
关于标识令牌,唯一可以依赖的是它始终包含sub
声明(用户表中的Id)。这里的filosophy的简短版本是保持标记较小,因为您所需要的只是该声明。可以在UserInfo端点请求其他信息。标识令牌的内容可能会有所不同。例如,您可以强制将所有索赔添加到第一个令牌(AlwaysIncludeUserClaimsInIdToken),以防止额外呼叫
另一方面,如果用户选择不给予同意,则标识令牌将保持为空(子声明除外,因为scope=openid是必需的)。也可以在从UserInfo端点请求时使用
所以问题是,你将如何使用身份令牌?令牌有多少价值?您不应该使用它来访问资源(访问令牌就是用来访问资源的),而且它可能不包含请求的信息