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;
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); }