C# 正在获取标识资源-标识服务器4

C# 正在获取标识资源-标识服务器4,c#,.net,asp.net-core,identityserver4,C#,.net,Asp.net Core,Identityserver4,我是Identity Server 4的新手,正在努力获取用户的身份。目前,我正在通过Identity Server保护的API显示声明: namespace API01.Controllers { [Route("identity")] [Authorize] public class IdentityController : ControllerBase { // GET identity [HttpGet] p

我是Identity Server 4的新手,正在努力获取用户的身份。目前,我正在通过Identity Server保护的API显示
声明

namespace API01.Controllers
{
    [Route("identity")]
    [Authorize]
    public class IdentityController : ControllerBase
    {
        // GET identity
        [HttpGet]
        public IActionResult Get()
        {          
            return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
        }
    }
}
这方面的问题是,当我解码
jwt
时,
email
资源只是显示为值
email

"scope": [
    "email",
    "openid",
    "api1"
  ],
我一直在尝试使用
User.identifies
,但到目前为止,我无法从
allowedscope{“email”、“openid”、“api1”}
中获得所需的信息


基本上,我想要得到的值在我的例子中是
test@test.com
。我不担心返回一个
JsonResult
,只要一个字符串就足够了,如果它很困难的话。

范围数组指示允许访问的内容。 您可能希望在令牌中看到电子邮件声明


为此,您需要实现
IProfilrService
,并将
Subject
中的所有声明添加到
IssuedClaims

范围数组指示允许访问的内容。 您可能希望在令牌中看到电子邮件声明


为此,您需要实现
IProfilrService
,并将
Subject
中的所有声明添加到
IssuedClaims

如果您想将电子邮件声明包括在您的id令牌中,您可以在IDS4的
IdentityResources
中添加
IdentityResources.email()

public static IEnumerable<IdentityResource> GetIdentityResources()
{
    return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Profile(),
        new IdentityResources.Email()
    };
}
你可以从一开始


如果您想在jwt令牌中找到
作用域
,id令牌将不包括
作用域
声明,但访问令牌包括,因为api应该验证它

如果要在id令牌中包含电子邮件声明,可以在IDS4的
IdentityResources
中添加
IdentityResources.email()

public static IEnumerable<IdentityResource> GetIdentityResources()
{
    return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Profile(),
        new IdentityResources.Email()
    };
}
你可以从一开始


如果您想在jwt令牌中找到
作用域
,id令牌将不包括
作用域
声明,但访问令牌包括,因为api应该验证它

感谢您的回复,我并不担心它会显示在令牌中,只是更感兴趣的是在我的API的
Get()
方法中获取它,并用它做一些事情。是的,但是是什么让用户产生了所有的声明呢?它是中间件API吗?从代币上?它是否包含您需要的声明;-)我有一个令牌服务器(WebAPI),一个带有中间件的WebAPI,还有一个控制台应用程序作为客户端。你有一个例子,因为我不太清楚这里需要什么。谢谢,令牌服务器是Identity server 4吗?是的,这是Identity Server 4感谢您的回复,我并不担心它显示在令牌中,只是更感兴趣的是在我的API的
Get()
方法中获取它,并用它做一些事情。是的,但是什么创造了用户及其所有声明?它是中间件API吗?从代币上?它是否包含您需要的声明;-)我有一个令牌服务器(WebAPI),一个带有中间件的WebAPI,还有一个控制台应用程序作为客户端。你有一个例子,因为我不太清楚这里需要什么。谢谢,令牌服务器是Identity server 4吗?是的,是Identity Server 4感谢您的回答,我已经尝试了上述方法,但仍然无法从令牌或操作方法的
jsonResult
访问电子邮件的实际值。我已经开始快速入门,我是第2名
GrantTypes.ResourceOwnerPassword
,这可能是一个问题,因为我注意到您有
GrantTypes.HybridAndClientCredentials
。那么,我只是想澄清一下,我收到的是一个ID令牌还是一个访问令牌?正如我所读到的,后者不包含这样的信息?使用混合流或资源所有者流不是问题。如果您获得API访问权,那么您将获得id令牌和访问令牌。ID令牌声明将映射到用户原则,您可以通过用户退出。声明获得答案,我已尝试了上述方法,但仍然无法从令牌或操作方法的
jsonResult
访问电子邮件的实际值。我已经开始快速入门,我是第2名
GrantTypes.ResourceOwnerPassword
,这可能是一个问题,因为我注意到您有
GrantTypes.HybridAndClientCredentials
。那么,我只是想澄清一下,我收到的是一个ID令牌还是一个访问令牌?正如我所读到的,后者不包含这样的信息?使用混合流或资源所有者流不是问题。如果您获得API访问权,那么您将获得id令牌和访问令牌。ID令牌声明将映射到用户原则,您可以按用户退出该原则。声明请在添加新用户时确认您是否将声明映射到用户(即AspNetuserClaims表)。是的,我是,但我刚才注意到了一点。。。我正在将
索赔
映射到
用户
,但我没有使用
索赔=new[]{new“索赔1”、new“索赔2”、…}
,我的是
索赔={new“索赔1”、new“索赔2”、…}
。我不确定这是否重要。当我有时间时将进行测试,因为我正在阅读文档中的Quickstart 3。请确认您在添加新用户时是否正在与用户(即AspNetuserClaims表)映射声明。是的,但我刚才注意到了一点。。。我正在将
索赔
映射到
用户
,但我没有使用
索赔=new[]{new“索赔1”、new“索赔2”、…}
,我的是
索赔={new“索赔1”、new“索赔2”、…}
。我不确定这是否重要。我将在有时间的时候进行测试,因为我正在阅读文档中的Quickstart 3。