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

IdentitySever4 user claims and ASP.NET User.Identity

我已经按照文档中的示例编写了一个小型 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 中尝试获取用户身份时,名称 属性 返回为 null,而且我没有看到电子邮件声明。无论我做什么,我总是看到相同的 12 个声明。 sub 声明是唯一通过我在 Client 对象中输入的信息传递的声明。

如何填充 HttpContext.User.Identity.Name 属性 并发送有关用户的其他 claims/data?

在对 UseOpenIdConnectAuthentication 的调用中,或者在您尝试使用令牌的任何地方,确保将名称 属性 的 TokenValidationParameters 设置为 ClaimTypes.Name .

默认情况下,Name 声明类型设置为 name (JwtClaimType.Name)。

原因可能是您没有为您的客户请求正确的 resources/scopes。

  1. 您需要使用访问令牌中所需的声明来定义 API 资源。

例如,在 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 资源。

例如 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. Post API 的访问令牌,您将获得添加到 API 资源的声明。