public async Task <GetChallengeLinkResponse> ExecuteAsync(GenerateContextRequest request)
        {
            var challengeContext = _identitiesProvider.GenerateContext();
            var nonce            = _identitiesProvider.GenerateNonce();

            // classic flow is not supported
            request.IsPartial = true;

            string   did     = null;
            string   payload = null;
            FlowType flowType;

            switch (request.Type)
            {
            case ChallengeType.Register:
            case ChallengeType.Login:
                flowType = !request.IsPartial ? FlowType.Authorize : FlowType.PartialAuthorize;
                break;

            case ChallengeType.Link:
                var state = await GetLinkState(request.Payload?.ToString());

                if (state.ConnectedDevicesCount >= _configuration.MaximumNumberOfConnectedDevices)
                {
                    return(new GetChallengeLinkResponse(default, _urlProvider.GetWebAppConnectionsUrl().ToString(),
                                                        default, default, _magicLinkEnabled));
                }

                did      = state.DID;
                flowType = request.IsQr ? FlowType.LinkWithPin : FlowType.Link;
                break;
Пример #2
0
        public async Task <MagicLinkResponse> ExecuteAsync(string email)
        {
            var did = await _userHandlerAdapter.GetUserIdByEmail(email);

            if (string.IsNullOrEmpty(did))
            {
                throw new CommandValidationException($"No user was found with email '{email}'");
            }

            var result  = new MagicLinkResponse();
            var context = _identitiesProvider.GenerateContext();
            var token   = _identitiesProvider.GenerateMagicLinkToken();

            await _cacheItemRepository.CreateAsync(new CacheItem
            {
                ChallengeType = ChallengeType.Login,
                Context       = context,
                Payload       = token,
                DID           = did,
                Status        = CacheItemStatus.Finished
            }, _tokenExpiration);

            if (_magicLinkConfiguration.SameBrowserUsageOnly)
            {
                result.CheckTokenKey      = $"ownid-mlc-{context}";
                result.CheckTokenValue    = GetCheckToken(context, token, did);
                result.CheckTokenLifetime = _magicLinkConfiguration.TokenLifetime;
            }

            var userName = await _userHandlerAdapter.GetUserNameAsync(did);

            var link  = new UriBuilder(_magicLinkConfiguration.RedirectUrl);
            var query = HttpUtility.ParseQueryString(link.Query);

            query["ownid-mtkn"] = token;
            query["ownid-ctxt"] = context;
            link.Query          = query.ToString() ?? string.Empty;

            var subject = string.Format(_localizationService.GetLocalizedString("Email_MagicLink_Subject"),
                                        _ownIdCoreConfiguration.Name);
            var body = _localizationService.GetLocalizedString("Email_MagicLink_Body")
                       .Replace("{userName}", userName)
                       .Replace("{link}", link.Uri.ToString());

            await _emailService.SendAsync(email, subject, body, true, userName);

            return(result);
        }