private static IEnumerable<Claim> MapClaims(IEnumerable<Claim> inputClaims, PolicyScope mappingScope)
{
List<Claim> mappedClaims = new List<Claim>();
foreach (PolicyRule rule in mappingScope.Rules)
{
IEnumerable<Claim> matchingInputClaims = MatchesRule(rule, inputClaims);
if (matchingInputClaims != null && matchingInputClaims.Any())
{
foreach (var matchingInputClaim in matchingInputClaims)
{
string outputValue;
if (rule.OutputClaim.CopyFromInput)
{
if (rule.InputClaims.ElementAt(0).Value != Wildcard)
{
if (rule.OutputClaim.CopyFrom.ToUpperInvariant().Equals(CopyFromConstants.InputValue))
{
outputValue = rule.InputClaims.ElementAt(0).Value;
}
else
{
outputValue = rule.InputClaims.ElementAt(0).Issuer.DisplayName;
}
}
else
{
if (rule.OutputClaim.CopyFrom.ToUpperInvariant().Equals(CopyFromConstants.InputValue))
{
outputValue = matchingInputClaim.Value;
}
else
{
var issuer = mappingScope.Issuers.FirstOrDefault(i => i.Uri == matchingInputClaim.Issuer);
outputValue = issuer != null ? issuer.DisplayName : matchingInputClaim.Issuer;
}
}
}
else
{
outputValue = rule.OutputClaim.Value;
}
var originalIssuer = mappingScope.Issuers.FirstOrDefault(i => i.Uri == matchingInputClaim.OriginalIssuer);
string originalIssuerDisplayName = originalIssuer != null ? originalIssuer.DisplayName : matchingInputClaim.Issuer;
mappedClaims.Add(
new Claim(
rule.OutputClaim.ClaimType.FullName,
outputValue,
matchingInputClaim.ValueType,
matchingInputClaim.Issuer,
originalIssuerDisplayName));
}
}
}
return mappedClaims;
}