static void Main(string[] args)
{
SetupClaimsPrincipal();
Console.WriteLine(Thread.CurrentPrincipal.AsClaims().EmailAddress);
Console.WriteLine(Thread.CurrentPrincipal.AsClaims().Name);
Console.ReadLine();
}
private static void SetupClaimsPrincipal()
{
var claims = new ClaimsIdentity(new Claim[] {
new Claim(ClaimTypes.Name, "matias"),
new Claim(ClaimTypes.Email, "matias@southworks.net")
});
var principal = new ClaimsPrincipal(new ClaimsIdentity[] { claims });
Thread.CurrentPrincipal = principal;
}
}
static class ClaimsExtensions
{
public static dynamic AsClaims(this IPrincipal principal)
{
var claimsPrincipal = principal as IClaimsPrincipal;
if (claimsPrincipal != null)
{
var identity = claimsPrincipal.Identity as IClaimsIdentity;
return new DynamicClaims(identity.Claims);
}
return null;
}
}
class DynamicClaims : DynamicObject
{
private readonly ClaimCollection claims;
public DynamicClaims(ClaimCollection claims)
{
this.claims = claims;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = GetClaim(binder.Name, this.claims);
return result != null;
}
private string GetClaim(string hint, ClaimCollection claims)
{
var found = claims.Where( c => c.ClaimType.Substring(c.ClaimType.LastIndexOf('/') + 1).Equals(hint, StringComparison.OrdinalIgnoreCase));
if (found.Count() > 1)
throw new InvalidOperationException(string.Format("More than one claim ({0}) matched the name: {1}", string.Join(",", claims.Select(c => c.Value)), hint));
if (found.SingleOrDefault() == null)
throw new InvalidOperationException(string.Format("No claim was found that ends with after the trailing slash: {0}", hint));
return found.SingleOrDefault().Value;
}
}