Exemple #1
0
        public async Task <RegistrationContext> GetRegistrationContext(string redirectUrl)
        {
            var disco = await _httpClient.GetDiscoveryDocumentAsync(_oidc.Authority);

            if (disco.IsError)
            {
                throw new Exception(disco.Error);
            }

            var redirectUri = _urlBuilder.Create()
                              .Path(redirectUrl)
                              .ToString();

            var registrationUrl = disco.TryGetString("registration_endpoint");

            var tokenResponse = await _httpClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
            {
                Address      = disco.TokenEndpoint,
                ClientId     = _oidc?.ClientId,
                ClientSecret = _oidc?.ClientSecret,
                Scope        = _options.Scope
            });

            if (tokenResponse.IsError)
            {
                throw new Exception(tokenResponse.Error);
            }

            var url = _urlBuilder
                      .Create(registrationUrl)
                      .AddQuery("ReturnUrl", redirectUri)
                      .AddQuery("token", HttpUtility.UrlEncode(tokenResponse.AccessToken))
                      .ToString();

            return(new RegistrationContext(url));
        }
        public async Task <ForgotPasswordCommandResult> Handle(ForgotPasswordCommand request,
                                                               CancellationToken cancellationToken)
        {
            var user = await _userManager.FindByEmailAsync(request.Email);

            if (user == null)
            {
                return new ForgotPasswordCommandResult
                       {
                           IsSuccess = false,
                           Message   = $"User {request.Email} not found."
                       }
            }
            ;

            var token = await _userManager.GeneratePasswordResetTokenAsync(user);

            var encodedToken = Base64UrlEncoder.Encode(token);

            _urlBuilder
            .Create(_interactionOptions.UserInteractionEndpoints.BaseUrl)
            .Path(_interactionOptions.UserInteractionEndpoints.ResetPassword)
            .AddQuery("userId", user.Id)
            .AddQuery("token", encodedToken)
            .AddQuery("returnUrl", request.ReturnUrl);


            var forgotPasswordRequestedEvent = new ForgotPasswordRequestedEvent
            {
                UserId = user.Id,
                Url    = _urlBuilder.ToString()
            };

            await _eventPublisher.PublishAsync(forgotPasswordRequestedEvent);

            return(new ForgotPasswordCommandResult
            {
                Token = token,
                IsSuccess = true
            });
        }
    }
Exemple #3
0
        public async Task <RegisterUserCommandResult> Handle(RegisterUserCommand request,
                                                             CancellationToken cancellationToken)
        {
            if (!string.IsNullOrWhiteSpace(request.Token))
            {
                var validationResult = await _tokenValidator.ValidateAccessTokenAsync(request.Token);

                if (validationResult.IsError)
                {
                    throw new DomainException(validationResult.Error);
                }

                if (!validationResult.Client?.RedirectUris.Any(url =>
                                                               url.Equals(request.ReturnUrl, StringComparison.OrdinalIgnoreCase)) ?? true)
                {
                    throw new DomainException($"Invalid return url: {request.ReturnUrl}");
                }
            }
            else if (!string.IsNullOrWhiteSpace(request.ReturnUrl))
            {
                var context = await _interactionService.GetAuthorizationContextAsync(request.ReturnUrl);

                if (context == null)
                {
                    throw new DomainException("Invalid context");
                }
            }

            var user = await _userService.GetByUsername(request.Email, cancellationToken);

            if (user != null)
            {
                return new RegisterUserCommandResult
                       {
                           IsSuccess = false,
                           Errors    = new List <string>
                           {
                               $"Email {request.Email} already exists."
                           }
                       }
            }
            ;

            user = new ApplicationUser
            {
                Id             = Guid.NewGuid().ToString(),
                Email          = request.Email,
                UserName       = request.Email,
                EmailConfirmed = !_options.RequireConfirmedEmail
            };

            var password = !string.IsNullOrWhiteSpace(request.PlainTextPassword)
                ? request.PlainTextPassword
                : Guid.NewGuid().ToString().ToSha256();

            var result = await _userManager.CreateAsync(user, password);

            var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

            var encodedToken = Base64UrlEncoder.Encode(token);

            var response = new RegisterUserCommandResult
            {
                Id        = result.Succeeded ? user.Id : string.Empty,
                IsSuccess = result.Succeeded,
                Errors    = result.Errors.Select(e => e.Description)
            };

            if (!result.Succeeded)
            {
                return(response);
            }

            _urlBuilder
            .Create(_interactionOptions.UserInteractionEndpoints.BaseUrl)
            .Path(_interactionOptions.UserInteractionEndpoints.ConfirmUser)
            .AddQuery("userId", user.Id)
            .AddQuery("token", encodedToken)
            .AddQuery("returnUrl", request.ReturnUrl);

            var userRegisteredEvent = new UserRegisteredEvent
            {
                UserId = user.Id,
                Url    = _urlBuilder.ToString()
            };

            await _eventPublisher.PublishAsync(userRegisteredEvent);

            return(response);
        }
    }