web-dev-qa-db-ja.com

IdentityServerを作成してユーザーIDをアクセストークンに追加するにはどうすればよいですか?

短い:クライアントは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);
11
LOST

やったー、このページに出くわしたとき、私は答えを見つけました: https://github.com/IdentityServer/IdentityServer3.Samples/issues/17

どうやら、ユーザーIDはアクセストークンの「サブ」クレームで渡されます。 APIサンプルを盲目的にコピーしたため、その構成には

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

これにより、APIが「サブ」クレームをnameidentifierにマッピングできなくなりました。この行を削除した後、認証されたコントローラーのHttpContext.User.GetUserId()はユーザーIDを正しく返します。

8
LOST