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

Store array of int into claims with AddClaims

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

登录创建工单时我用这个来添加声明,但是如何添加一个复杂的对象。

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,只能添加字符串

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

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(';');

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

您可以将复杂对象序列化为 json,并将其添加到声明中。大致如下:

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

然后在读取时将其反序列化:

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