Пример #1
0
        private async Task <bool> CreateUser(AppUser user)
        {
            if (DefaultUserRoleIds.Count < 1)
            {
                DefaultUserRoleIds = _userContext.Roles.Where(x => x.Name.Equals(Roles.Users) || x.Name.Equals(Roles.Developer))
                                     .Select(x => x.Id).ToList();
            }

            var tenantIds = tenantDb.Tenants.Select(x => x.Id).ToList();

            var result = await AppUserService.CreateUser(
                pvtTenant.Id,
                _userManager,
                _userContext,
                user,
                DefaultUserRoleIds,
                DefaultUserPermissions,
                tenantIds);

            if (result.Succeeded)
            {
                var sendResult = await SendActiveEmail(user);

                return(true);
            }

            AddErrors(result);

            return(false);
        }
Пример #2
0
        public void CreateUserGetObjectNull()
        {
            IAppUserService service  = new AppUserService();
            const string    userName = "******";

            AppUser user = service.CreateUser(userName, Password, Salt);

            Assert.Null(user);
        }
Пример #3
0
        public void CreateUserGetObject()
        {
            IAppUserService service  = new AppUserService();
            const string    userName = "******";

            AppUser user = service.CreateUser(userName, Password, Salt);

            Assert.Equal(userName, user.Username);

            //clean up todo delete when mock is working
            service.DeleteAppUser(user.Id);
        }
Пример #4
0
        public async Task <ApiResult <long> > Post([FromBody] AppUser value)
        {
            if (!ModelState.IsValid)
            {
                return(new ApiResult <long>(l, BasicControllerEnums.UnprocessableEntity,
                                            ModelErrors()));
            }

            var roleIds = db.Roles.Where(x => x.Name.Equals(Roles.Users) || x.Name.Equals(Roles.Developer))
                          .Select(x => x.Id).ToList();

            var permissions = typeof(UserPermissions).GetFields()
                              .Select(x => x.GetCustomAttribute <PolicyClaimValuesAttribute>().ClaimsValues[0]).ToList();

            var tenantIds = tenantDb.Tenants.Select(x => x.Id).ToList();

            try
            {
                var result = await AppUserService.CreateUser(
                    TenantId,
                    userManager,
                    db,
                    value,
                    roleIds,
                    string.Join(",", permissions),
                    tenantIds);

                db.Add(value);

                if (result.Succeeded)
                {
                    return(new ApiResult <long>(value.Id));
                }

                else
                {
                    return(new ApiResult <long>(l, UserControllerEnums.Post_CreateUserFail,
                                                JsonConvert.SerializeObject(result.Errors)));
                }
            }

            catch (Exception ex)
            {
                return(new ApiResult <long>(l,
                                            BasicControllerEnums.ExpectationFailed,
                                            ex.Message));
            }
        }
        public async Task <ApiResult <long> > Post([FromBody] AppUser value)
        {
            if (!ModelState.IsValid)
            {
                return(new ApiResult <long>(l, BasicControllerEnums.UnprocessableEntity,
                                            ModelErrors()));
            }

            var roleIds = db.Roles.Where(x => x.Name.Equals(DefaultRoles.User) || x.Name.Equals(DefaultRoles.Developer))
                          .Select(x => x.Id).ToList();

            var tenantIds = tenantDb.Tenants.Select(x => x.Id).ToList();

            try
            {
                var result = await AppUserService.CreateUser(
                    TenantId,
                    userManager,
                    db,
                    value,
                    roleIds,
                    $"{AppConstant.MicroServiceName}.all",
                    tenantIds);

                db.Add(value);

                if (result.Succeeded)
                {
                    return(new ApiResult <long>(value.Id));
                }

                else
                {
                    return(new ApiResult <long>(l, UserControllerEnums.Post_CreateUserFail,
                                                JsonConvert.SerializeObject(result.Errors)));
                }
            }

            catch (Exception ex)
            {
                return(new ApiResult <long>(l,
                                            BasicControllerEnums.ExpectationFailed,
                                            ex.Message));
            }
        }
Пример #6
0
        public async Task <ApiResult <string> > Register([FromBody] UserRegisterRequest value)
        {
            if (!ModelState.IsValid)
            {
                return(new ApiResult <string>(l, BasicControllerEnums.UnprocessableEntity,
                                              ModelErrors()));
            }

            #region 校验邮箱是否重复
            if (await db.Users.AnyAsync(x => x.Email.Equals(value.Email)))
            {
                return(new ApiResult <string>(l, UserControllerEnums.Register_EmailExists));
            }
            #endregion
            #region 校验邮箱验证码
            if (!string.IsNullOrWhiteSpace(value.EmailVerifyCode))
            {
                try
                {
                    var UnprotectStr = Unprotect(value.EmailVerifyCode);
                }
                catch
                {
                    return(new ApiResult <string>(l, UserControllerEnums.Register_EmailVerifyCodeError));
                }
            }
            #endregion

            #region 校验手机号是否重复
            if (await db.Users.AnyAsync(x => x.PhoneNumber.Equals(value.PhoneNumber)))
            {
                return(new ApiResult <string>(l, UserControllerEnums.Register_PhoneNumberExists));
            }
            #endregion
            #region 校验手机验证码
            var PhoneNumberVerifyCodeKey = UserControllerKeys.VerifyCode_Phone + value.PhoneNumber + ":" + value.PhoneNumberVerifyCode;

            if (await redis.KeyExistsAsync(PhoneNumberVerifyCodeKey) == false)
            {
                return(new ApiResult <string>(l, UserControllerEnums.Register_PhoneNumberVerifyCodeError));
            }

            await redis.RemoveAsync(PhoneNumberVerifyCodeKey);

            #endregion

            #region 创建用户
            var user = new AppUser
            {
                UserName             = value.Email,
                Email                = value.Email,
                PhoneNumber          = value.PhoneNumber,
                NickName             = value.NickName,
                Gender               = value.Gender,
                Address              = value.Address,
                Birthday             = value.Birthday,
                PhoneNumberConfirmed = true,
                Stature              = value.Stature,
                Weight               = value.Weight,
                Description          = value.Description,
                CreateDate           = DateTime.UtcNow,
                LastUpdateTime       = DateTime.UtcNow,
                EmailConfirmed       = true,
                ParentUserID         = UserId
            };

            #region 确认邮箱验证通过
            //如果填写了邮件验证码,并且验证通过(不通过不会走到这里)
            if (!string.IsNullOrWhiteSpace(value.EmailVerifyCode))
            {
                user.EmailConfirmed = true;
            }
            #endregion

            #region 图片
            if (value.ImageUrl != null && value.ImageUrl.Count > 0)
            {
                user.Files.Add(new AspNetUserFile()
                {
                    Files    = JsonConvert.SerializeObject(value.ImageUrl),
                    FileType = FileTypes.Image,
                });
            }
            #endregion

            #region 视频
            if (!string.IsNullOrWhiteSpace(value.Video))
            {
                user.Files.Add(new AspNetUserFile()
                {
                    Files    = value.Video,
                    FileType = FileTypes.Video,
                });
            }
            #endregion

            #region 文档
            if (!string.IsNullOrWhiteSpace(value.Doc))
            {
                user.Files.Add(new AspNetUserFile()
                {
                    Files    = value.Doc,
                    FileType = FileTypes.Doc,
                });
            }
            #endregion

            var roleIds = db.Roles.Where(x => x.Name.Equals(Roles.Users) || x.Name.Equals(Roles.Developer))
                          .Select(x => x.Id).ToList();

            var permissions = typeof(UserPermissions).GetFields().Select(x => x.GetCustomAttribute <PolicyClaimValuesAttribute>().ClaimsValues[0]).ToList();

            var tenantIds = tenantDbContext.Tenants.Select(x => x.Id).ToList();

            var result = await AppUserService.CreateUser(TenantId,
                                                         userManager,
                                                         db,
                                                         user,
                                                         roleIds,
                                                         string.Join(",", permissions),
                                                         tenantIds);

            if (result.Succeeded)
            {
                return(new ApiResult <string>());
            }

            else
            {
                return(new ApiResult <string>(l, BasicControllerEnums.ExpectationFailed,
                                              JsonConvert.SerializeObject(result.Errors)));
            }
            #endregion
        }
        /// <summary>
        /// 数据库初始化
        /// </summary>
        public static void InitializeDatabase(IApplicationBuilder app, IConfigurationRoot config)
        {
            Tenant.AppHostName = config["IdentityServer"];

            Tenant.IdentityServerIssuerUri = Tenant.AppHostName;

            TestClient.RedirectUris[0] = string.Format(TestClient.RedirectUris[0], Tenant.AppHostName);

            using (var scope = app.ApplicationServices.GetService <IServiceScopeFactory>().CreateScope())
            {
                #region identityserver
                scope.ServiceProvider.GetRequiredService <PersistedGrantDbContext>().Database.Migrate();
                var context = scope.ServiceProvider.GetRequiredService <ConfigurationDbContext>();
                context.Database.Migrate();
                if (!context.Clients.Any())
                {
                    foreach (var client in GetClients())
                    {
                        context.Clients.Add(client.ToEntity());
                    }
                    context.SaveChanges();
                }
                if (!context.IdentityResources.Any())
                {
                    foreach (var resource in GetIdentityResources())
                    {
                        context.IdentityResources.Add(resource.ToEntity());
                    }
                    context.SaveChanges();
                }
                if (!context.ApiResources.Any())
                {
                    foreach (var resource in GetApiResources())
                    {
                        context.ApiResources.Add(resource.ToEntity());
                    }
                    context.SaveChanges();
                }
                #endregion

                #region tenant
                var tenantDbContext = scope.ServiceProvider.GetRequiredService <TenantDbContext>();
                tenantDbContext.Database.Migrate();
                if (!tenantDbContext.Tenants.Any())
                {
                    #region Create Default Tenant
                    var tenant = new AppTenant()
                    {
                        CacheDuration           = 600,
                        CreateDate              = DateTime.UtcNow,
                        IdentityServerIssuerUri = Tenant.IdentityServerIssuerUri,
                        LastUpdateTime          = DateTime.UtcNow,
                        Name        = Tenant.Name,
                        OwnerUserId = AppConstant.seedUserId, //默认设置为1
                        Status      = TenantStatus.Enable,
                        Theme       = "default"
                    };
                    tenant.Hosts.Add(new AppTenantHost()
                    {
                        HostName = Tenant.AppHostName
                    });
                    tenant.Properties.AddRange(Tenant.TenantProperties.Select(x => new AppTenantProperty()
                    {
                        Key = x.Key, Value = x.Value
                    }));
                    tenantDbContext.Tenants.Add(tenant);
                    tenantDbContext.SaveChanges();
                    #endregion
                }
                #endregion

                var userContext = scope.ServiceProvider.GetRequiredService <IdentityDbContext>();
                userContext.Database.Migrate();

                if (!userContext.Roles.Any())
                {
                    foreach (var role in GetRoles())
                    {
                        userContext.Roles.Add(role);
                    }
                    userContext.SaveChanges();
                }

                if (!userContext.Users.Any())
                {
                    var userManager = scope.ServiceProvider.GetRequiredService <UserManager <AppUser> >();

                    var roleIds = userContext.Roles.Select(x => x.Id).ToList();

                    var permissions = typeof(UserPermissions).GetFields().Select(x => x.GetCustomAttribute <PolicyClaimValuesAttribute>().ClaimsValues[0]).ToList();
                    permissions.Add(MicroServiceName + ".all");

                    var tenantIds = tenantDbContext.Tenants.Select(x => x.Id).ToList();

                    foreach (var _user in GetUsers())
                    {
                        var r = AppUserService.CreateUser(AppConstant.seedTenantId,
                                                          userManager,
                                                          userContext,
                                                          _user,
                                                          roleIds,
                                                          string.Join(",", permissions),
                                                          tenantIds).Result;

                        #region User Clients
                        var clientIds = context.Clients.Select(x => x.Id).ToList();
                        foreach (var cid in clientIds)
                        {
                            _user.Clients.Add(new AspNetUserClient()
                            {
                                ClientId = cid
                            });
                        }
                        #endregion

                        #region User ApiResources
                        var apiIds = context.ApiResources.Select(x => x.Id).ToList();
                        foreach (var apiId in apiIds)
                        {
                            _user.ApiResources.Add(new AspNetUserApiResource()
                            {
                                ApiResourceId = apiId,
                            });
                        }
                        #endregion

                        userContext.SaveChanges();
                    }
                }
            }
        }
Пример #8
0
        static void Data_Seeding_Users(
            UserDbContext userContext,
            TenantDbContext tenantDbContext,
            UserManager <AppUser> userManager,
            ConfigurationDbContext identityserverDbContext,
            IdentityServer4MicroServiceOptions options)
        {
            if (!userContext.Roles.Any())
            {
                var roles = typeof(DefaultRoles).GetFields();

                foreach (var role in roles)
                {
                    var roleName = role.GetRawConstantValue().ToString();

                    userContext.Roles.Add(new AppRole
                    {
                        Name             = roleName,
                        NormalizedName   = roleName,
                        ConcurrencyStamp = Guid.NewGuid().ToString()
                    });
                }

                userContext.SaveChanges();
            }

            if (!userContext.Users.Any())
            {
                var roleIds = userContext.Roles.Select(x => x.Id).ToList();

                var tenantIds = tenantDbContext.Tenants.Select(x => x.Id).ToList();

                var user = new AppUser()
                {
                    Email          = options.DefaultUserAccount,
                    UserName       = options.DefaultUserAccount,
                    PasswordHash   = options.DefaultUserPassword,
                    EmailConfirmed = true,
                    ParentUserID   = AppConstant.seedUserId
                };

                var r = AppUserService.CreateUser(AppConstant.seedTenantId,
                                                  userManager,
                                                  userContext,
                                                  user,
                                                  roleIds,
                                                  $"{AppConstant.MicroServiceName}.all",
                                                  tenantIds).Result;

                #region User Clients
                var clientIds = identityserverDbContext.Clients.Select(x => x.Id).ToList();
                foreach (var cid in clientIds)
                {
                    user.Clients.Add(new AspNetUserClient()
                    {
                        ClientId = cid
                    });
                }
                #endregion

                #region User ApiResources
                var apiIds = identityserverDbContext.ApiResources.Select(x => x.Id).ToList();
                foreach (var apiId in apiIds)
                {
                    user.ApiResources.Add(new AspNetUserApiResource()
                    {
                        ApiResourceId = apiId,
                    });
                }
                #endregion

                userContext.SaveChanges();
            }
        }
        static void Data_Seeding_Users(
            UserDbContext userContext,
            TenantDbContext tenantDbContext,
            UserManager <AppUser> userManager,
            ConfigurationDbContext identityserverDbContext,
            string MicroServiceName)
        {
            if (!userContext.Roles.Any())
            {
                var roles = typeof(Roles).GetFields();

                foreach (var role in roles)
                {
                    var roleName = role.GetRawConstantValue().ToString();

                    var roleDisplayName = role.GetCustomAttribute <DisplayNameAttribute>().DisplayName;

                    userContext.Roles.Add(new AppRole
                    {
                        Name             = roleName,
                        NormalizedName   = roleDisplayName,
                        ConcurrencyStamp = Guid.NewGuid().ToString()
                    });
                }

                userContext.SaveChanges();
            }

            if (!userContext.Users.Any())
            {
                var roleIds = userContext.Roles.Select(x => x.Id).ToList();

                var permissions = typeof(UserPermissions).GetFields().Select(x => x.GetCustomAttribute <PolicyClaimValuesAttribute>().PolicyValues[0]).ToList();
                permissions.Add(MicroServiceName + ".all");

                var tenantIds = tenantDbContext.Tenants.Select(x => x.Id).ToList();

                var user = new AppUser()
                {
                    Email          = Admin.Email,
                    UserName       = Admin.Email,
                    PasswordHash   = Admin.PasswordHash,
                    EmailConfirmed = true,
                    ParentUserID   = AppConstant.seedUserId
                };

                var r = AppUserService.CreateUser(AppConstant.seedTenantId,
                                                  userManager,
                                                  userContext,
                                                  user,
                                                  roleIds,
                                                  string.Join(",", permissions),
                                                  tenantIds).Result;

                #region User Clients
                var clientIds = identityserverDbContext.Clients.Select(x => x.Id).ToList();
                foreach (var cid in clientIds)
                {
                    user.Clients.Add(new AspNetUserClient()
                    {
                        ClientId = cid
                    });
                }
                #endregion

                #region User ApiResources
                var apiIds = identityserverDbContext.ApiResources.Select(x => x.Id).ToList();
                foreach (var apiId in apiIds)
                {
                    user.ApiResources.Add(new AspNetUserApiResource()
                    {
                        ApiResourceId = apiId,
                    });
                }
                #endregion

                userContext.SaveChanges();
            }
        }
Пример #10
0
        /// <summary>
        /// 自动生成用户
        /// </summary>
        /// <param name="provider">The provider.</param>
        /// <param name="userId">The user identifier.</param>
        /// <param name="claims">The claims.</param>
        /// <returns></returns>
        private AppUser AutoProvisionUser(string provider, string userId, List <Claim> claims)
        {
            var userClaims = new List <AppUserClaim>();

            foreach (var claim in claims)
            {
                // if the external system sends a display name - translate that to the standard OIDC name claim
                if (claim.Type == ClaimTypes.Name)
                {
                    userClaims.Add(new AppUserClaim()
                    {
                        ClaimType = JwtClaimTypes.Name, ClaimValue = claim.Value
                    });
                }
                // if the JWT handler has an outbound mapping to an OIDC claim use that
                else if (JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.ContainsKey(claim.Type))
                {
                    userClaims.Add(new AppUserClaim()
                    {
                        ClaimType = JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap[claim.Type], ClaimValue = claim.Value
                    });
                }
                // copy the claim as-is
                else
                {
                    userClaims.Add(new AppUserClaim()
                    {
                        ClaimType = claim.Type, ClaimValue = claim.Value
                    });
                }
            }

            // if no display name was provided, try to construct by first and/or last name
            if (!userClaims.Any(x => x.ClaimType == JwtClaimTypes.Name))
            {
                var first = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.GivenName)?.Value;
                var last  = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.FamilyName)?.Value;
                if (first != null && last != null)
                {
                    userClaims.Add(new AppUserClaim()
                    {
                        ClaimType = JwtClaimTypes.Name, ClaimValue = first + " " + last
                    });
                }
                else if (first != null)
                {
                    userClaims.Add(new AppUserClaim()
                    {
                        ClaimType = JwtClaimTypes.Name, ClaimValue = first
                    });
                }
                else if (last != null)
                {
                    userClaims.Add(new AppUserClaim()
                    {
                        ClaimType = JwtClaimTypes.Name, ClaimValue = last
                    });
                }
            }

            var name   = userClaims.FirstOrDefault(c => c.ClaimType == JwtClaimTypes.Name)?.ClaimValue;
            var openid = userClaims.FirstOrDefault(x => x.ClaimType == JwtClaimTypes.Subject)?.ClaimValue;
            var email  = userClaims.FirstOrDefault(x => x.ClaimType == JwtClaimTypes.Email)?.ClaimValue;
            var user   = new AppUser
            {
                Email    = email,
                NickName = name
            };

            var picture = claims.FirstOrDefault(x => JwtClaimTypes.Picture == x.Type || ClaimTypes.Uri == x.Type);

            if (picture != null)
            {
                user.Avatar = picture.Value;
            }

            user.UserName = user.UserKey.ToString("n");

            user.Claims.AddRange(userClaims);

            user.Logins.Add(new AppUserLogin()
            {
                LoginProvider       = provider,
                ProviderKey         = userId,
                ProviderDisplayName = provider
            });

            var roleIds = db.Roles.Where(x => x.Name.Equals(DefaultRoles.User)).Select(x => x.Id).ToList();

            var result = AppUserService.CreateUser(
                TenantId,
                _SignInManager.UserManager,
                db,
                user,
                roleIds,
                $"{MicroServiceName}.all",
                new List <long>()
            {
                TenantId
            }).Result;

            if (result.Succeeded)
            {
                return(user);
            }

            throw new Exception(JsonConvert.SerializeObject(result.Errors));
        }