webdevqa.jp.net

Claimに文字列のリストを格納する(System.Security.Claims)

私は、認証タイプとしてAsp.Net 5 MVC、Owin、およびOauth2ベアラートークンを使用してWebアプリを開発しています。

文字列"CODEFOO,CODBAR,CODEX,.."のリストを System.Security.Claims.Claim 内にカスタムクレームタイプで保存する必要があります。

ユーザーがトークンをリクエストすると、この「ユーザーコード」のリストがバックエンドから取得され、特定のカスタムクレームタイプを使用してID内に設定されます。
ユーザーがトークンを送り返し、特定のMVCアクションをナビゲートすると、アプリケーションはクレーム内のユーザーコードのリストに特定のコードが含まれているかどうかを確認する必要があります。

List<string> userCodes = rep.GetUserCodeFromBackEnd();
string userCodesClaimType = "http://foo.it/claim/usercodesclaimtype";

現在、文字列のリストをJSONでシリアル化しています。

var claim = new Claim(userCodesCaimType, JsonConvert.SerializeObject(userCodes));

次のような方法で逆シリアル化して元に戻します。

var userCodesClaim = identity.Claims.FirstOrDefault<Claim>(c=>c.Type == userCodesClaimType) ;
var userCodesClaimValue = JsonConvert.DeserializeObject<List<string>>(userCodesClaim.Value);

ここで質問:クレーム内に値のリストを格納するより良い方法はありますか?
Claimには ValueType プロパティがあり、ドキュメントには次のように記載されています。

ValueTypeプロパティには、値のタイプ情報を識別する文字列が含まれています。このプロパティを使用して、値の形式を理解し、値をシリアル化および逆シリアル化する方法に関する情報を提供できます。ソリューションで複雑な値の型が必要な場合は、ValueTypeプロパティで標準のXMLスキーマ型を使用して、Valueプロパティを文字列からシリアル化および逆シリアル化する方法を示すことをお勧めします。

残念ながら、そのプロパティの使用を文書化した例は見つかりませんでした。
Jsonのシリアル化は問題ありませんか、それともValueTypeアプローチを使用する必要がありますか?

23
systempuntoout

ValueTypeは、XMLスキーマタイプを含むなど、値がどのように解釈/逆シリアル化されるかをコードが識別する方法です。異なるソースからのコード間で使用する場合、それは理にかなっていますが、独自のアプリケーションでは、内容の解釈方法を知っている限り、それを無視できます。

ただし、複数の値を設定するために、複雑な型を使用する必要はありません。クレームIDは、同じClaimTypeを持つ複数のクレームを持つことができるため、コードをJSon文字列にシリアル化する代わりに、複数のクレームを追加する必要があります。ユーザーコードごとに1つ。すべて同じクレームタイプを持っています。これにより、特定のユーザーコードが存在するかどうかを確認するためにHasClaimメソッドを使用できるようになります。

20
Anders Abel

JSONを使用するか、複数値クレーム(LDAP用語では複数値属性)を使用します。

混同しないようにしましょうSystem.Security.Claims.Claim.TypeおよびClaim.ValueType。タイプは「クレーム名」(LDAPの属性名が話す)です。見る System.Security.Claims.ClaimTypesサンプルURIの場合。 ValueTypeはXMLシリアル化用です。見る System.Security.Claims.ClaimValueTypesサンプルURIの場合。

ValueTypeを使用して適切にシリアル化することを考えていました。それは完全に不可能ではありません、あなたはそれをあなた自身でプログラムする必要があるでしょう。 (SAMLトークンで)それを処理できる他の多くはないと思います。彼らがあなたに銃を持っていない限り、そうしないでください。ドミニクもあなたに警告しました。

いくつか書く必要があります。 MSフォーラムへの投稿 これはWIF 3.5の場合ですが、原則は.NET4.5でも同じです。

4
paullem