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

时间:2014-07-20 09:15:55

标签: c# asp.net-mvc-5 wif owin claims-based-identity

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

我需要在System.Security.Claims.Claim中使用自定义声明类型存储字符串"CODEFOO,CODBAR,CODEX,.."的列表。

当用户请求令牌时,此“用户代码”列表将从后端获取,并使用特定的自定义声明类型在身份内设置。
当用户发回令牌,导航特定的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);

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

  

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

不幸的是,我没有找到任何记录该财产使用情况的例子 Json序列化是正确的还是我应该使用ValueType方法?

2 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:4)

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

不要混淆System.Security.Claims.Claim.Type和Claim.ValueType。 类型是&#34;声明名称&#34; (LDAP中的属性名称)。有关示例uris,请参阅System.Security.Claims.ClaimTypes。 ValueType用于XML序列化。有关示例uris,请参阅System.Security.Claims.ClaimValueTypes。

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

您需要写一些内容,请参阅:http://social.msdn.microsoft.com/Forums/vstudio/en-US/a11365c2-9b44-49db-97f2-50c30adff14d/complex-type-in-claims 这适用于WIF 3.5,但原理在.NET 4.5下是相同的。