public async Task <IActionResult> MakeCredential([FromBody] AuthenticatorAttestationRawResponse attestationResponse) { var o = new { challenge = string.Empty, origin = string.Empty, type = string.Empty }; var username = string.Empty; try { o = JsonConvert.DeserializeAnonymousType((Encoding.UTF8.GetString(attestationResponse.Response.ClientDataJson)), o); var jsonOptions = _memoryCache.Get <string>(o.challenge); var options = CredentialCreateOptions.FromJson(jsonOptions); username = options.User.Name; async Task <bool> Callback(IsCredentialIdUniqueToUserParams args) { var users = await _dataStore.GetUsersByCredentialIdAsync(args.CredentialId); return(users.Count <= 0); } var success = await _lib.MakeNewCredentialAsync(attestationResponse, options, Callback); _dataStore.AddCredentialToUser(options.User, new StoredCredential { Descriptor = new PublicKeyCredentialDescriptor(success.Result.CredentialId), PublicKey = success.Result.PublicKey, UserHandle = success.Result.User.Id, SignatureCounter = success.Result.Counter, CredType = success.Result.CredType, RegDate = DateTime.Now, AaGuid = success.Result.Aaguid }); var ev = new Event(username, "Successfully logged the person in", nameof(RegistrationController), nameof(MakeCredential)); await _elasticClient.IndexAsync(ev, i => i.Index(GetIndexName(nameof(Ok)))); return(Ok(success)); } catch (Exception e) { var errorEvent = new ErrorEvent(e, username, nameof(RegistrationController), nameof(MakeCredential)); await _elasticClient.IndexAsync(errorEvent, i => i.Index(GetIndexName(nameof(Exception)))); return(Ok(new Fido2.CredentialMakeResult { Status = "error", ErrorMessage = FormatException(e) + $"ClientDataJson = {Encoding.UTF8.GetString(attestationResponse.Response.ClientDataJson)}" })); } }