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

Posted

技术标签:

【中文标题】在 Claim (System.Security.Claims) 中存储字符串列表【英文标题】:Storing a list of string in Claim (System.Security.Claims) 【发布时间】:2014-09-11 00:14:26 【问题描述】:

我正在开发一个使用 Asp.Net 5 MVC、Owin 和 Oauth2 不记名令牌作为身份验证类型的 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);

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

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

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

【问题讨论】:

为什么不添加多个声明? 我也在寻找添加对复杂类型或字符串数​​组的支持。有一些怎么实现的? 【参考方案1】:

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

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

【讨论】:

我相信你把代表值类型的ValueType与Claim Type混淆了。【参考方案2】:

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

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

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

你需要写一些东西,见post on MS forums 这是针对 WIF 3.5 的,但在 .NET 4.5 下原理相同。

【讨论】:

感谢您的反馈。我想我会尝试创建多个与 Anders Abel 建议的类型相同的声明。

以上是关于在 Claim (System.Security.Claims) 中存储字符串列表的主要内容,如果未能解决你的问题,请参考以下文章

缺少System.Security.dll程序集

System.Security.Cryptography.CryptographicException:在 Visual Studio 中抛出的密钥集不存在

System.Security.Cryptography.CryptographicException:密钥集不存在

Azure 函数无法加载文件或程序集“System.Security.Cryptography.Pkcs”

`self.Clients.claim()` 有啥用

有没有办法在自定义 System.Security.IPermission 实现上修复此 FxCop CA2103 警告?