在Claim中存储字符串列表(System.Security.Claims)

sys*_*out 21 c# claims-based-identity wif owin asp.net-mvc-5

我正在使用Asp.Net 5 MVC,Owin和Oauth2 bearer token作为auth类型开发一个Web应用程序.

我需要"CODEFOO,CODBAR,CODEX,.."System.Security.Claims.Claim中存储一个带有自定义声明类型的字符串列表.

当用户请求令牌时,此"用户代码"列表将从后端获取,并使用特定的自定义声明类型在身份内设置.
当用户发回令牌,导航特定的MVC动作时,应用程序必须检查声明内的用户代码列表是否包含特定代码.

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

现在我正在使用JSON序列化字符串列表.

var claim = new Claim(userCodesCaimType, JsonConvert.SerializeObject(userCodes));
Run Code Online (Sandbox Code Playgroud)

并使用以下内容将其反序列化:

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

现在的问题是:有没有更好的方法来存储索赔中的值列表?
Claim有一个ValueType属性,文档说:

ValueType属性包含一个标识值的类型信息的字符串.此属性可用于了解值的格式,并提供有关如何序列化和反序列化值的信息.如果您的解决方案需要复杂的值类型,建议您在ValueType属性中使用标准XML模式类型来指示Value属性如何从字符串序列化和反序列化.

不幸的是,我没有找到任何记录该属性使用的示例.
Json序列化是正确的还是我应该使用ValueType方法?

And*_*bel 20

ValueType是代码识别如何解释/反序列化值的方法,例如包含XML模式类型.如果在不同来源的代码之间使用它是有意义的,但在您自己的应用程序中,只要您知道如何解释内容,就可以忽略它.

但要拥有多个值,您将不需要使用复杂类型.声明标识可以具有相同的多个声明ClaimType,因此不应将代码序列化为JSon字符串,而应添加多个声明; 每个用户代码一个.所有人都有相同的索赔类型.这将使得可以使用该HasClaim方法来检查是否存在特定用户代码.


pau*_*lem 5

坚持使用 JSON 或使用多值声明(LDAP 术语中的多值属性)。

我们不要混淆System.Security.Claims.Claim.TypeClaim.ValueType。类型是“声明名称”(LDAP 中的属性名称)。请参阅System.Security.Claims.ClaimTypes示例 uri。 ValueType用于 XML 序列化。请参阅System.Security.Claims.ClaimValueTypes示例 uri。

您正在考虑使用ValueType正确序列化。这并非完全不可能,您需要自己编程。恐怕没有多少其他人可以处理它(在 SAML 令牌中)。所以不要,除非他们拿着枪对着你。多米尼克也警告过你。

您需要写一些东西,请参阅MS 论坛上的帖子 这是针对 WIF 3.5 的,但在 .NET 4.5 下原理相同。