public async Task <ActionResult> Enroll(PerformTaskModel model) { if (!ModelState.IsValid) { return(View(nameof(Index), model)); } return(await PerformTask(model, "enroll")); }
public async Task <ActionResult> Callback(string access_token, string error, string state) { if (string.IsNullOrEmpty(access_token)) { // redirect to an error page throw new ApplicationException("BWS callback has been invoked with invalid arguments."); } var model = new PerformTaskModel(); // decode the token: string claimstring = System.Text.Encoding.UTF8.GetString(Utils.Base64Url.Decode(access_token.Split('.')[1])); var claims = JObject.Parse(claimstring); model.BCID = (string)claims["bcid"]; Uri host = new Uri((string)claims["aud"]); if (!string.IsNullOrWhiteSpace(error)) { model.Error = error; } // ask the BWS for the result try { HttpClient httpClient = new HttpClient(); string credentials = Convert.ToBase64String(System.Text.Encoding.GetEncoding("iso-8859-1").GetBytes($"{_appID}:{_appSecret}")); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials); UriBuilder uri = new UriBuilder("https", host.Host, 443, "extension/result", $"?access_token={access_token}"); HttpResponseMessage response = await httpClient.GetAsync(uri.Uri); string content = await response.Content.ReadAsStringAsync(); model.Result = $"{response.StatusCode} ({(int)response.StatusCode}): {content}"; } catch (Exception ex) { model.Result = $"Error: {ex.Message}"; } return(View(nameof(Index), model)); }
private async Task <ActionResult> PerformTask(PerformTaskModel model, string task) { // well lets start by fetching a BWS token HttpClient httpClient = new HttpClient(); string credentials = Convert.ToBase64String(System.Text.Encoding.GetEncoding("iso-8859-1").GetBytes($"{_appID}:{_appSecret}")); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials); string query = $"?id={_appID}&bcid={model.BCID}&task={task}&livedetection=true&challenge={model.ChallengeResponse}&autoenroll={model.AutoEnroll}"; if (!model.ApiUrl.EndsWith("/")) { model.ApiUrl += "/"; } UriBuilder u = new UriBuilder(model.ApiUrl); UriBuilder uri = new UriBuilder(u.Scheme, u.Host, u.Port, u.Path + "token", query); HttpResponseMessage response = await httpClient.GetAsync(uri.Uri); if (!response.IsSuccessStatusCode) { ModelState.AddModelError("", $"Token Request returned '{response.StatusCode}': {response.Content.ReadAsStringAsync().Result}"); return(View(nameof(Index), model)); } // fine, fine, lets read the token string token = await response.Content.ReadAsStringAsync(); // parse the token to find additional settings for the user interface string claimstring = System.Text.Encoding.UTF8.GetString(Utils.Base64Url.Decode(token.Split('.')[1])); var claims = JObject.Parse(claimstring); var taskFlags = (TokenTask)claims["task"].Value <int>(); var challenges = (string)claims["challenge"]; int recordings = (taskFlags & TokenTask.LiveDetection) == TokenTask.LiveDetection ? (taskFlags & TokenTask.Enroll) == TokenTask.Enroll ? 3 : 2 : 1; string challengesJson = "[]"; if ((taskFlags & TokenTask.ChallengeResponse) == TokenTask.ChallengeResponse) { recordings = 4; if (!string.IsNullOrEmpty(challenges)) { challengesJson = challenges; string[][] challengeSequences = JsonConvert.DeserializeObject <string[][]>(challenges); if (challengeSequences.Length > 0 && challengeSequences[0].Length > 0) { recordings = challengeSequences[0].Length + 1; } } } var viewName = "PerformTask"; if (model.ShowHead) { viewName = "PerformTaskHead"; } // render the BWS unified user interface return(View(viewName, new UUIViewModel { Task = (taskFlags & TokenTask.Enroll) == TokenTask.Enroll ? "enrollment" : (taskFlags & TokenTask.Identify) == TokenTask.Identify ? "identification" : "verification", MaxTries = (int)(taskFlags & TokenTask.MaxTriesMask), Recordings = recordings, ChallengeResponse = (taskFlags & TokenTask.ChallengeResponse) == TokenTask.ChallengeResponse, ChallengesJson = challengesJson, Token = token, ApiUrl = model.ApiUrl, ReturnUrl = new Uri(Request.Url, "Callback").ToString(), State = "encrypted_app_status", AutoEnroll = (taskFlags & TokenTask.AutoEnroll) == TokenTask.AutoEnroll, AutoStart = false, SilverlightSupport = !Request.Browser.IsMobileDevice, MotionBar = model.MotionBar })); }