IdentitySever4用户声明和ASP.NET User.Identity

时间:2017-04-26 08:47:45

标签: identityserver4

我按照文档中的示例编写了一个小型IdentityServer演示服务器。我有以下TestUser

new TestUser
{
    SubjectId = "1",
    Username = "Username",
    Password = "password",
    Claims = new List<Claim>()
    {
        new Claim(System.Security.Claims.ClaimTypes.Name, "Username"),
        new Claim(System.Security.Claims.ClaimTypes.Email, "username@domain.com")
    }
}

我使用ResourceOwnerPassword流获取访问令牌。我有权访问我的API。

问题是,当我在受保护的API中尝试获取用户身份时,name属性将返回null,并且我看不到电子邮件声明。无论我做什么,我总能看到同样的12个主张。 sub声明是我在Client对象中输入的唯一信息。

如何填充HttpContext.User.Identity.Name属性并发送有关用户的其他声明/数据?

2 个答案:

答案 0 :(得分:5)

原因可能是您没有为您的客户请求适当的资源/范围。

  1. 您需要使用访问令牌中所需的声明来定义API资源。
  2. 例如,在Resources.cs中,您可以添加要包含在所有api2范围中的声明

            new ApiResource
                {
                    Name = "api2",
    
                    ApiSecrets =
                    {
                        new Secret("secret".Sha256())
                    },
    
                    UserClaims =
                    {
                        JwtClaimTypes.Name,
                        JwtClaimTypes.Email
                    },
    
                    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"
                        }
                    }
                }
    
    1. 然后,您允许资源所有者客户端访问这些API资源。
    2. 例如在client.cs

              new Client
                  {
                      ClientId = "roclient",
                      ClientSecrets =
                      {
                          new Secret("secret".Sha256())
                      },
      
                      AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
      
                      AllowOfflineAccess = true,
                      AllowedScopes =
                      {
                          IdentityServerConstants.StandardScopes.OpenId,
                          "custom.profile",
                          "api1", "api2.read_only"
                      }
                  },
      
      1. 然后,您可以在您的roclient

        中请求范围
         client.RequestResourceOwnerPasswordAsync("bob", "bob", "api2.read_only", optional).Result
        
      2. 将访问令牌发布到API,您将获得添加到API资源的声明。

      3. enter image description here

答案 1 :(得分:0)

在致电UseOpenIdConnectAuthentication时,或者您尝试使用该令牌的任何地方,请务必将名称属性的TokenValidationParameters设置为ClaimTypes.Name

默认情况下,Name声明类型设置为nameJwtClaimType.Name)。 enter image description here