如何让 IdentityServer 将用户身份添加到访问令牌?
How to make IdentityServer to add user identity to the access token?
简短:我的客户端从 IdentityServer 示例服务器检索访问令牌,然后将其传递到我的 WebApi。在我的控制器中,this.HttpContext.User.GetUserId() returns null(尽管用户有其他声明)。我怀疑访问令牌中没有 nameidentity 声明。如何让 IdentityServer 包含它?
到目前为止我尝试过的:
- 从混合流切换到隐式流(随机尝试)
在我添加的 IdSvrHost 范围定义中
声明 = { new ScopeClaim(ClaimTypes.NameIdentifier, alwaysInclude: true) }
在我添加的 IdSvrHost 客户端定义中
索赔 = { 新索赔(ClaimTypes.NameIdentifier, "42") }
(也是随机尝试)
范围定义中的其他范围我也试过,都没有出现。似乎 nameidentity 通常包含在身份令牌中,但对于我所知道的大多数 public API,您不会向服务器提供身份令牌。
更多详情:
IdSrvHost 和 Api 在不同的主机上。
控制器具有[授权]。事实上,我可以看到其他的说法。
Api配置为
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
app.UseIdentityServerAuthentication(options => {
options.Authority = "http://localhost:22530/";
// TODO: how to use multiple optional scopes?
options.ScopeName = "borrow.slave";
options.AdditionalScopes = new[] { "borrow.receiver", "borrow.manager" };
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
});
范围:
public static Scope Slave { get; } = new Scope {
Name = "borrow.slave",
DisplayName = "List assigned tasks",
Type = ScopeType.Resource,
Claims = {
new ScopeClaim(ClaimTypes.NameIdentifier, alwaysInclude: true),
},
};
和客户:
new Client {
ClientId = "borrow_node",
ClientName = "Borrow Node",
Flow = Flows.Implicit,
RedirectUris = new List<string>
{
"borrow_node:redirect-target",
},
Claims = { new Claim(ClaimTypes.NameIdentifier, "42") },
AllowedScopes = {
StandardScopes.OpenId.Name,
//StandardScopes.OfflineAccess.Name,
BorrowScopes.Slave.Name,
},
}
授权 URI:
request.CreateAuthorizeUrl(
clientId: "borrow_node",
responseType: "token",
scope: "borrow.slave",
redirectUri: "borrow_node:redirect-target",
state: state,
nonce: nonce);
我也试过了
request.CreateAuthorizeUrl(
clientId: "borrow_node",
responseType: "id_token token",
scope: "openid borrow.slave",
redirectUri: "borrow_node:redirect-target",
state: state,
nonce: nonce);
万岁,当我偶然发现这个页面时,我找到了答案:https://github.com/IdentityServer/IdentityServer3.Samples/issues/173
显然,用户身份是在访问令牌的 "sub" 声明中传递的。因为我盲目复制了API样本,其配置包括
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
这基本上阻止了我的 API 将 "sub" 声明映射到 nameidentifier。删除此行后,已验证控制器 returns 用户 ID 的 HttpContext.User.GetUserId() 正确。
简短:我的客户端从 IdentityServer 示例服务器检索访问令牌,然后将其传递到我的 WebApi。在我的控制器中,this.HttpContext.User.GetUserId() returns null(尽管用户有其他声明)。我怀疑访问令牌中没有 nameidentity 声明。如何让 IdentityServer 包含它?
到目前为止我尝试过的:
- 从混合流切换到隐式流(随机尝试)
在我添加的 IdSvrHost 范围定义中
声明 = { new ScopeClaim(ClaimTypes.NameIdentifier, alwaysInclude: true) }
在我添加的 IdSvrHost 客户端定义中
索赔 = { 新索赔(ClaimTypes.NameIdentifier, "42") }
(也是随机尝试)
范围定义中的其他范围我也试过,都没有出现。似乎 nameidentity 通常包含在身份令牌中,但对于我所知道的大多数 public API,您不会向服务器提供身份令牌。
更多详情: IdSrvHost 和 Api 在不同的主机上。 控制器具有[授权]。事实上,我可以看到其他的说法。 Api配置为
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
app.UseIdentityServerAuthentication(options => {
options.Authority = "http://localhost:22530/";
// TODO: how to use multiple optional scopes?
options.ScopeName = "borrow.slave";
options.AdditionalScopes = new[] { "borrow.receiver", "borrow.manager" };
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
});
范围:
public static Scope Slave { get; } = new Scope {
Name = "borrow.slave",
DisplayName = "List assigned tasks",
Type = ScopeType.Resource,
Claims = {
new ScopeClaim(ClaimTypes.NameIdentifier, alwaysInclude: true),
},
};
和客户:
new Client {
ClientId = "borrow_node",
ClientName = "Borrow Node",
Flow = Flows.Implicit,
RedirectUris = new List<string>
{
"borrow_node:redirect-target",
},
Claims = { new Claim(ClaimTypes.NameIdentifier, "42") },
AllowedScopes = {
StandardScopes.OpenId.Name,
//StandardScopes.OfflineAccess.Name,
BorrowScopes.Slave.Name,
},
}
授权 URI:
request.CreateAuthorizeUrl(
clientId: "borrow_node",
responseType: "token",
scope: "borrow.slave",
redirectUri: "borrow_node:redirect-target",
state: state,
nonce: nonce);
我也试过了
request.CreateAuthorizeUrl(
clientId: "borrow_node",
responseType: "id_token token",
scope: "openid borrow.slave",
redirectUri: "borrow_node:redirect-target",
state: state,
nonce: nonce);
万岁,当我偶然发现这个页面时,我找到了答案:https://github.com/IdentityServer/IdentityServer3.Samples/issues/173
显然,用户身份是在访问令牌的 "sub" 声明中传递的。因为我盲目复制了API样本,其配置包括
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
这基本上阻止了我的 API 将 "sub" 声明映射到 nameidentifier。删除此行后,已验证控制器 returns 用户 ID 的 HttpContext.User.GetUserId() 正确。