首页 文章

在IdentityServer4中的声明主体中获取访问令牌声明

提问于
浏览
1

我试图了解oAuth2 / IdentityServer4 .

使用示例应用程序
https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev/Quickstarts/3_ImplicitFlowAuthentication

MVC应用程序中的以下代码:

@foreach (var claim in User.Claims)
    {
        <dt>@claim.Type</dt>
        <dd>@claim.Value</dd>
    }

返回似乎是身份令牌声明的内容

nbf
1467173142
exp
1467173442
iss
http://localhost:5000
aud
MVC
nonce
636027699106782287.MDI0YzI5MTQtYmQxNy00MDllLWJmYzQtZjBhYzI2MGNjYmE3MDFmNzg1YmUtM2Y5ZC00YjBiLWEzOGItN2Q3ODRiODJlYjFl
iat
1467173142
c_hash
H2i5QeJKlHM5-s8vUTYlOw
sid
42b58d38e2b7c6cc653492742a08840b
sub
818727
auth_time
1467170555
idp
idsvr
name
爱丽丝史密斯
given_name
爱丽丝
family_name
工匠
website
http://alice.com
amr
PWD

API项目中的以下代码

var claims = User.Claims.Select(c => new { c.Type, c.Value });
 return new JsonResult(claims);

返回似乎是访问令牌声明的内容

{
   "Type": "nbf",
   "Value": "1467173142"
},
{
   "Type": "exp",
   "Value": "1467176742"
},
{
   "Type": "iss",
   "Value": "http://localhost:5000"
},
{
   "Type": "aud",
   "Value": "http://localhost:5000/resources"
},
{
   "Type": "client_id",
   "Value": "mvc"
},
{
   "Type": "scope",
   "Value": "openid"
},
{
   "Type": "scope",
   "Value": "profile"
},
{
   "Type": "scope",
  "Value": "api1"
},
{
   "Type": "sub",
   "Value": "818727"
},
{
   "Type": "auth_time",
   "Value": "1467170555"
},
{
   "Type": "idp",
   "Value": "idsvr"
}

请注意,代码基本相同(在用户身份原则中返回声明)并且缺少名称/电子邮件,但在API示例中包含范围声明 .

令牌流本质上是IdentityServer4 => MVC Project => API Project . 显然,MVC项目同时具有identityToken和访问令牌,但它没有加载访问令牌int User.Claims .

我的目标是在MVC项目中的User中提供范围声明,以便我可以设置策略以使用我的MVC方法的Authorize属性部分 .

API项目的启动在这里:https://github.com/IdentityServer/IdentityServer4.Samples/blob/dev/Quickstarts/3_ImplicitFlowAuthentication/src/Api/Startup.cs

MVC项目的启动在这里:https://github.com/IdentityServer/IdentityServer4.Samples/blob/dev/Quickstarts/3_ImplicitFlowAuthentication/src/Api/Startup.cs

谢谢,戴夫

1 回答

  • 4

    这个问题有点无效,但我会把它留在这里,理由是为什么以及为了节省其他时间的解决方案 .

    首先,有两个令牌用于两个不同的目的 .

    • 访问令牌:描述客户端,即使用API的软件 . 此处的任何声明都授予客户端对API endpoints 的访问权限 .

    • 身份令牌:这描述了用户或使用使用API的软件的人员 .

    最初的问题是询问如何在Identity令牌中查看客户端相关的范围,这显然是无效的 .

    但是,您可以在身份标记中包含标识范围 .

    为此,将Type设置为ScopeType.Resource并将IncludeAllClaimsForUser设置为true,如下所示

    new Scope()
                {
                  Name  = "ManageUsers",
                  IncludeAllClaimsForUser = true,
                  Type = ScopeType.Resource
                },
    

相关问题