短い:クライアントはIdentityServerサンプルサーバーからアクセストークンを取得し、それをWebApiに渡します。私のコントローラーでは、this.HttpContext.User.GetUserId()はnullを返します(ただし、ユーザーには他のクレームがあります)。アクセストークンにnameidentityクレームが含まれていないようです。 IdentityServerにそれを含めるにはどうすればよいですか?
私がこれまでに試したこと:
idSvrHostスコープ定義に追加しました
クレーム= {new ScopeClaim(ClaimTypes.NameIdentifier、alwaysInclude:true)}
idSvrHostクライアント定義に追加しました
クレーム= {新しいClaim(ClaimTypes.NameIdentifier、 "42")}
(ランダムな試みでもあります)
スコープ定義で他のスコープも試しましたが、どちらも表示されませんでした。 nameidentityは通常IDトークンに含まれているようですが、私が知っているほとんどのパブリックAPIでは、サーバーにIDトークンを提供していません。
詳細: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/17
どうやら、ユーザーIDはアクセストークンの「サブ」クレームで渡されます。 APIサンプルを盲目的にコピーしたため、その構成には
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
これにより、APIが「サブ」クレームをnameidentifierにマッピングできなくなりました。この行を削除した後、認証されたコントローラーのHttpContext.User.GetUserId()はユーザーIDを正しく返します。