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。
- 您需要使用访问令牌中所需的声明来定义 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"
}
}
}
- 然后您允许您的资源所有者客户端访问这些 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"
}
},
然后您可以在您的 roclient 中请求作用域
client.RequestResourceOwnerPasswordAsync("bob", "bob", "api2.read_only", optional).Result
Post API 的访问令牌,您将获得添加到 API 资源的声明。
我已经按照文档中的示例编写了一个小型 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。
- 您需要使用访问令牌中所需的声明来定义 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"
}
}
}
- 然后您允许您的资源所有者客户端访问这些 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"
}
},
然后您可以在您的 roclient 中请求作用域
client.RequestResourceOwnerPasswordAsync("bob", "bob", "api2.read_only", optional).Result
Post API 的访问令牌,您将获得添加到 API 资源的声明。