使用AddClaims将int数组存储到声明中

时间:2019-02-13 11:10:06

标签: c# .net-core claims-based-identity

我想将一个int数组放入Web应用程序.net core 2.2的声明中。

在登录以创建票证时,我使用它来添加声明,但是如何添加复杂的对象。

if (ticket.HasScope(OpenIdConnectConstants.Scopes.Profile))
{
    if (!string.IsNullOrWhiteSpace(user.FirstName))
        identity.AddClaim(CustomClaimTypes.FirstName, user.FirstName, OpenIdConnectConstants.Destinations.IdentityToken);

    if (!string.IsNullOrWhiteSpace(user.LastName))
        identity.AddClaim(CustomClaimTypes.LastName, user.LastName, OpenIdConnectConstants.Destinations.IdentityToken);
    if (user.Functions.Any())
        // not possible : Functions = List<int>
        identity.AddClaim(CustomClaimTypes.Functions, user.Functions, OpenIdConnectConstants.Destinations.IdentityToken);
}

使用AddClaims,只能添加字符串

2 个答案:

答案 0 :(得分:1)

您可以重复添加相同的声明类型,例如:

foreach(var f in user.Functions)
  identity.AddClaim(CustomClaimTypes.Functions, f.ToString(), OpenIdConnectConstants.Destinations.IdentityToken);

作为替代方案,您可以连接整数并在访问声明后将它们拆分:

if (user.Functions.Any())
{
  var joinedFunctions = string.Join(";", user.Functions);
  identity.AddClaim(CustomClaimTypes.Functions, joinedFunctions, OpenIdConnectConstants.Destinations.IdentityToken);
}

要检索值,可以在以后将其拆分:

functionsClaimValue.split(';');

您需要确保选择的分隔符(在此示例中为分号)不能包含在值中作为常规字符。

答案 1 :(得分:1)

您可以将复杂对象序列化为json,并将其添加到声明中。类似于:

identity.AddClaim(ClaimName, JsonConvert.SerializaObject(intArray));

然后在阅读后将其反序列化:

int[] intArray = JsonConvert.DeserializeObject<int[]>(claim.Value);