protected virtual Task <ClaimsPrincipal> CreatePrincipalAsync(PrincipalFactoryContext context)
        {
            var claims = new List <Claim>();

            if (context.Claims != null)
            {
                claims.AddRange(context.Claims);
            }
            if (claims.All(x => x.Type != ClaimTypes.NameIdentifier))
            {
                claims.Add(new Claim(ClaimTypes.NameIdentifier, context.AccountId.ToString(), ClaimValueTypes.String));
            }
            if (claims.All(x => x.Type != ClaimTypes.Name))
            {
                claims.Add(new Claim(ClaimTypes.Name, context.UserName, ClaimValueTypes.String));
            }

            if (context.Roles != null)
            {
                claims.AddRange(context.Roles.Select(role => new Claim(ClaimTypes.Role, role, ClaimValueTypes.String)));
            }

            var identity = new ClaimsIdentity(claims, context.AuthenticationType, ClaimTypes.Name, ClaimTypes.Role);

            return(Task.FromResult(new ClaimsPrincipal(identity)));
        }
 /// <summary>
 ///     Create a new principal
 /// </summary>
 /// <param name="context">information that should be stored in the created principal</param>
 /// <returns>created principal</returns>
 public static Task <ClaimsPrincipal> CreateAsync(PrincipalFactoryContext context)
 {
     return(_instance.CreateAsync(context));
 }
 Task <ClaimsPrincipal> IPrincipalFactory.CreateAsync(PrincipalFactoryContext context)
 {
     return(CreatePrincipalAsync(context));
 }