我按照文档中的示例编写了一个小型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
属性并发送有关用户的其他声明/数据?
答案 0 :(得分:5)
原因可能是您没有为您的客户请求适当的资源/范围。
例如,在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"
}
}
}
例如在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 :(得分:0)