using System.Collections.Generic;
using System.Security.Claims;
public static void Main()
Console.WriteLine( "What are the permissions if snowflake is {0}:", snowflake);
IList<string> permissions = CustomClaimsPermissions.PermissionConverter.ConvertFromLong(snowflake, CustomClaimsPermissions.GetDefaultPermissions());
foreach (var p in permissions){
var permissionsToSnowFlake = new List<string>()
CustomClaimsPermissions.SystemDisplayGroups,
CustomClaimsPermissions.SystemUnits,
Console.WriteLine( "Convert permissions to snowflake: {0}", CustomClaimsPermissions.PermissionConverter.ConvertToLong(permissionsToSnowFlake, CustomClaimsPermissions.GetDefaultPermissions()));
var permissionNames = CustomClaimsPermissions.GetDefaultPermissions();
var checkPermission = CustomClaimsPermissions.SystemAssets;
Console.WriteLine("If a user has a snowflake {0}, check if he has permissions to {1}", snowflake, checkPermission);
int permissionBit = Array.IndexOf(permissionNames.ToArray(), checkPermission);
var hasClaim = (snowflake & (1 << permissionBit)) != 0;
Console.WriteLine("Has {0}:{1}", checkPermission, hasClaim);
IList<string> currentPermissions = CustomClaimsPermissions.PermissionConverter.ConvertFromLong(snowflake, CustomClaimsPermissions.GetDefaultPermissions());
var newPermission = CustomClaimsPermissions.SystemAssets;
currentPermissions.Add(newPermission);
long updatedSnowflake = CustomClaimsPermissions.PermissionConverter.ConvertToLong(currentPermissions, CustomClaimsPermissions.GetDefaultPermissions());
Console.WriteLine("New snowflake: {0}", updatedSnowflake);
Console.WriteLine("If a user has a snowflake {0}, check if he has permissions to {1}", updatedSnowflake, checkPermission);
permissionBit = Array.IndexOf(permissionNames.ToArray(), checkPermission);
hasClaim = (updatedSnowflake & (1 << permissionBit)) != 0;
Console.WriteLine("Has {0}:{1}", checkPermission, hasClaim);
public static class CustomClaimsPermissions
public const string SystemAssets = "System: Assets";
public const string SystemDisplayGroups = "System: Display Groups";
public const string SystemMap = "System: Map";
public const string SystemUnits = "System: Units";
public const string SystemUsers = "System: Users";
public const string SystemCustomers = "System: Customers";
public static IList<string> GetDefaultPermissions()
return new List<string>()
public static class PermissionConverter
public static long ConvertToLong(IList<string> permissions, IList<string> permissionNames)
for (int i = 0; i < permissionNames.Count; i++)
if (permissions.Contains(permissionNames[i]))
result += (long) Math.Pow(2, i);
public static IList<string> ConvertFromLong(long value, IList<string> permissionNames)
List<string> permissions = new List<string>();
for (int i = 0; i < permissionNames.Count; i++)
if ((value & (1L << i)) != 0)
permissions.Add(permissionNames[i]);
public static bool HasPermission(ClaimsPrincipal user, string permission)
IList<string> permissionNames = GetDefaultPermissions();
Claim snowflakeClaim = user.Claims.FirstOrDefault(c => c.Type == "snowflake");
if (snowflakeClaim == null)
if (!long.TryParse(snowflakeClaim.Value, out snowflake))
int permissionBit = Array.IndexOf(permissionNames.ToArray(), permission);
return (snowflake & (1 << permissionBit)) != 0;
public static void UpdateUserPermissions(ClaimsPrincipal user, string newPermission)
Claim snowflakeClaim = user.Claims.FirstOrDefault(c => c.Type == "snowflake");
if (snowflakeClaim == null)
if (!long.TryParse(snowflakeClaim.Value, out snowflake))
IList<string> permissions = ConvertFromLong(snowflake, GetDefaultPermissions());
permissions.Add(newPermission);
long updatedSnowflake = ConvertToLong(permissions, GetDefaultPermissions());
user.Identities.First().AddClaim(new Claim("snowflake", updatedSnowflake.ToString()));