Thinktecture JWT認証リソース所有者フローを使用して、クライアントの消費にJWTのクレーム部分を使用します。私の質問は、IDサーバーにクレームを追加し、クライアントで配列としてデコードすることが可能かどうかです。
配列型のClaimTypeValuesはありません。
回避策として、
var user = IdentityServerPrincipal.Create(response.UserName, response.UserName);
user.Identities.First().AddClaims(
new List<Claim>()
{
new Claim(ClaimTypes.Name, response.UserName),
new Claim(ClaimTypes.Email, response.Email),
new Claim(FullName, response.FullName),
new Claim(AuthorizedCompanies,JsonConvert.SerializeObject(response.AuthorizedCompanies))
});
return new AuthenticateResult(user);
AuthorizedCompaniesのクレームにjson配列としてクレームを追加し、クライアント側で解析します。ここでのデザインパターンは何ですか?
個人的な経験から言えば、ValueTypeが常に「String」タイプの場合、クレームストアとの相互運用が容易になります。複雑なタイプを扱っていることがわかっている場合は直感に反しているように見えるかもしれませんが、少なくとも理解するのは簡単です。
この配列の必要性にアプローチする方法は、アプリケーションコードexpect問題のクレームタイプに複数のクレームが存在し、各クレーム値を単純なタイプに保つことです。
例:
var authorizeCompanies = identity.FindAll(AuthorizedCompanies).Select(c => c.Value);
そしてもちろん、あなたはそれらをそのように追加します:
identity.AddClaim(ClaimTypes.Name, response.UserName);
identity.AddClaim(AuthorizedCompanies, "CompanyX");
identity.AddClaim(AuthorizedCompanies, "CompanyY");
identity.AddClaim(AuthorizedCompanies, "CompanyZ");
IdentityServerは、このモデルをすぐにサポートします。このようなIDのトークンを生成すると、そのクレームの値が配列として自動的に書き込まれます。
{
"aud": "Identity Server example/resources",
"iss": "Identity Server example",
"exp": 1417718816,
"sub": "1234",
"scope": ["read", "write"], // <-- HERE
"foo": ["bar", "baz"], // <-- HERE TOO!
"nbf": 1417632416
}
クレームに対するこのアプローチは、すべてのクレームがタイプ->値の1対1のマッピングであると想定するのとは対照的です。
単一の値を配列に追加する場合、IdentityServerは値を配列から文字列に変換します。より簡単な解決策は、配列をjsonとして変換し、valueTypeをjsonとしてクレームに追加することです。
IList<string> companies = new List<string>();
companies.Add("CompanyA");
string companiesJson = JsonConvert.SerializeObject(companies);
context.IssuedClaims.Add(new Claim("Companies", companiesJson, IdentityServerConstants.ClaimValueTypes.Json));
上記のソリューションでは、1つ以上の値を追加して配列として要求できます。