Added support for multiple values (arrays) in default claim action (#1501)

* Added support for multiple values (arrays) in default claim action

* Added tests to claim action update to support array values
This commit is contained in:
tstojecki 2017-10-31 17:27:07 +01:00 committed by Chris Ross
parent 794e9c79fd
commit 88cb3df0eb
2 changed files with 71 additions and 1 deletions

View File

@ -32,7 +32,22 @@ namespace Microsoft.AspNetCore.Authentication.OAuth.Claims
/// <inheritdoc /> /// <inheritdoc />
public override void Run(JObject userData, ClaimsIdentity identity, string issuer) public override void Run(JObject userData, ClaimsIdentity identity, string issuer)
{ {
var value = userData?.Value<string>(JsonKey); var value = userData?[JsonKey];
if (value is JValue)
{
AddClaim(value?.ToString(), identity, issuer);
}
else if (value is JArray)
{
foreach (var v in value)
{
AddClaim(v?.ToString(), identity, issuer);
}
}
}
private void AddClaim(string value, ClaimsIdentity identity, string issuer)
{
if (!string.IsNullOrEmpty(value)) if (!string.IsNullOrEmpty(value))
{ {
identity.AddClaim(new Claim(ClaimType, value, ValueType, issuer)); identity.AddClaim(new Claim(ClaimType, value, ValueType, issuer));

View File

@ -0,0 +1,55 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.IO;
using System.Linq;
using System.Security.Claims;
using Microsoft.AspNetCore.Testing.xunit;
using Xunit;
using Microsoft.AspNetCore.Authentication.OAuth.Claims;
using Newtonsoft.Json.Linq;
namespace Microsoft.AspNetCore.Authentication
{
public class ClaimActionTests
{
[Fact]
public void CanMapSingleValueUserDataToClaim()
{
var userData = new JObject
{
["name"] = "test"
};
var identity = new ClaimsIdentity();
var action = new JsonKeyClaimAction("name", "name", "name");
action.Run(userData, identity, "iss");
Assert.Equal("name", identity.FindFirst("name").Type);
Assert.Equal("test", identity.FindFirst("name").Value);
}
[Fact]
public void CanMapArrayValueUserDataToClaims()
{
var userData = new JObject
{
["role"] = new JArray { "role1", "role2" }
};
var identity = new ClaimsIdentity();
var action = new JsonKeyClaimAction("role", "role", "role");
action.Run(userData, identity, "iss");
var roleClaims = identity.FindAll("role").ToList();
Assert.Equal(2, roleClaims.Count);
Assert.Equal("role", roleClaims[0].Type);
Assert.Equal("role1", roleClaims[0].Value);
Assert.Equal("role", roleClaims[1].Type);
Assert.Equal("role2", roleClaims[1].Value);
}
}
}