gpt4 book ai didi

c# - 如何让IdentityServer将用户身份添加到访问 token 中?

转载 作者:行者123 更新时间:2023-12-02 04:39:31 25 4
gpt4 key购买 nike

简短:我的客户端从 IdentityServer 示例服务器检索访问 token ,然后将其传递到我的 WebApi。在我的 Controller 中, this.HttpContext.User.GetUserId() 返回 null (尽管用户有其他声明)。我怀疑访问 token 中没有 nameidentity 声明。如何让 IdentityServer 包含它?

到目前为止我已经尝试过:

  • 从混合流切换到隐式流(随机尝试)
  • 在我添加的 IdSvrHost 范围定义中

    Claims = { new ScopeClaim(ClaimTypes.NameIdentifier, alwaysIninclude: true) }

  • 在我添加的 IdSvrHost 客户端定义中

    Claims = { new Claim(ClaimTypes.NameIdentifier, "42") }

(也是随机尝试)

我还尝试过范围定义中的其他范围,但都没有出现。看起来,nameidentity 通常包含在身份 token 中,但对于我所知的大多数公共(public) API,您不向服务器提供身份 token 。

更多详情:IdSrvHost 和 Api 位于不同的主机上。 Controller 有[授权]。事实上,我可以看到其他说法的出现。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

显然,用户身份是在访问 token 的“sub”声明中传递的。因为我盲目复制了API示例,所以它的配置包括了

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

这基本上阻止了我的 API 将“sub”声明映射到 nameidentifier。删除此行后,经过身份验证的 Controller 的 HttpContext.User.GetUserId() 会正确返回用户 ID。

关于c# - 如何让IdentityServer将用户身份添加到访问 token 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36522773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com