示例#1
0
        public async Task <IdentityResult> CreateAsync(IUser user, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            if (!(user is User newUser))
            {
                throw new ArgumentException("Expected a User instance.", nameof(user));
            }

            var newUserId = newUser.UserId;

            if (String.IsNullOrEmpty(newUserId))
            {
                // Due to database collation we normalize the userId to lower invariant.
                newUserId = _userIdGenerator.GenerateUniqueId(user).ToLowerInvariant();
            }

            try
            {
                var attempts = 10;

                while (await _session.QueryIndex <UserIndex>(x => x.UserId == newUserId).CountAsync() != 0)
                {
                    if (attempts-- == 0)
                    {
                        throw new ApplicationException("Couldn't generate a unique user id. Too many attempts.");
                    }

                    newUserId = _userIdGenerator.GenerateUniqueId(user).ToLowerInvariant();
                }

                newUser.UserId = newUserId;

                var context = new UserCreateContext(user);

                await Handlers.InvokeAsync((handler, context) => handler.CreatingAsync(context), context, _logger);

                if (context.Cancel)
                {
                    return(IdentityResult.Failed());
                }

                _session.Save(user);
                await _session.SaveChangesAsync();

                await Handlers.InvokeAsync((handler, context) => handler.CreatedAsync(context), context, _logger);
            }
            catch (Exception e)
            {
                _logger.LogError(e, "Unexpected error while creating a new user.");

                return(IdentityResult.Failed());
            }

            return(IdentityResult.Success);
        }
示例#2
0
 public Task CreatingAsync(UserCreateContext context) => Task.CompletedTask;
 public Task CreatingAsync(UserCreateContext context)
 {
     return(Task.CompletedTask);
 }
示例#4
0
 public Task CreatedAsync(UserCreateContext context)
 => RecordAuditTrailEventAsync(UserAuditTrailEventConfiguration.Created, context.User, _httpContextAccessor.HttpContext.User?.FindFirstValue(ClaimTypes.NameIdentifier), _httpContextAccessor.HttpContext.User?.Identity?.Name);
示例#5
0
 public override Task CreatedAsync(UserCreateContext context)
 {
     return(TriggerWorkflowEventAsync(nameof(UserCreatedEvent), (User)context.User));
 }