/// <summary> /// Returns Speech to Text results for the given audio input. Will write a WAV/RIFF header to the output stream with the audio details provided. /// If ANY audio details are passed in with a null value, a RIFF header will not be written. /// </summary> /// <returns>Detailed Speech to Text results, including the N best results for the given speech input.</returns> /// <param name="audioStream">Audio stream containing the speech.</param> /// <param name="sampleRate">The sample rate of the audio stream.</param> /// <param name="channelCount">The number of channels in the audio stream.</param> /// <param name="bitsPerSample">The bits per sample of the audio stream.</param> /// <param name="recordingTask">A <see cref="Task"/> that will complete when recording is complete.</param> /// <remarks> /// More info here: https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/bingvoicerecognition#output-format /// </remarks> public async Task <RecognitionResult> SpeechToTextDetailed(Stream audioStream, int?sampleRate, int?channelCount, int?bitsPerSample, Task recordingTask = null) { try { if (AuthenticationMode == AuthenticationMode.AuthorizationToken) { await AuthClient.Authenticate(); } var response = await SendRequest( () => CreateRequest (OutputMode.Detailed), () => PopulateRequestContent (audioStream, channelCount, sampleRate, bitsPerSample, recordingTask)); if (response != null) { return(JsonConvert.DeserializeObject <RecognitionResult> (response)); } return(null); } catch (Exception ex) { Debug.WriteLine(ex.Message); throw; } }
/// <summary> /// Returns Speech to Text results for the given audio input. Begins sending the audio stream to the server immediately. /// </summary> /// <returns>Simple Speech to Text results, which is a single result for the given speech input.</returns> /// <param name="audioFilePath">Audio file path.</param> /// <remarks> /// More info here: https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/bingvoicerecognition#output-format /// </remarks> public async Task <RecognitionSpeechResult> SpeechToTextSimple(string audioFilePath) { try { if (!string.IsNullOrEmpty(audioFilePath)) { if (AuthenticationMode == AuthenticationMode.AuthorizationToken) { await AuthClient.Authenticate(); } Debug.WriteLine("Authenticated, sending speech request :: {0}", DateTime.Now); var response = await SendRequest( () => CreateRequest (OutputMode.Simple), () => PopulateRequestContent (audioFilePath)); if (response != null) { return(JsonConvert.DeserializeObject <RecognitionSpeechResult> (response)); } } return(null); } catch (Exception ex) { Debug.WriteLine(ex.Message); throw; } }
/// <summary> /// Returns Speech to Text results for the given audio input. /// </summary> /// <returns>Detailed Speech to Text results, including the N best results for the given speech input.</returns> /// <param name="audioFilePath">Audio file path.</param> /// <remarks> /// More info here: https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/bingvoicerecognition#output-format /// </remarks> public async Task <RecognitionResult> SpeechToTextDetailed(string audioFilePath) { try { if (AuthenticationMode == AuthenticationMode.AuthorizationToken) { await AuthClient.Authenticate(); } var response = await SendRequest( () => CreateRequest (OutputMode.Detailed), () => PopulateRequestContent (audioFilePath)); if (response != null) { return(JsonConvert.DeserializeObject <RecognitionResult> (response)); } return(null); } catch (Exception ex) { Debug.WriteLine(ex.Message); throw; } }
public AuthResponse AuthenticateUser(string username, string password, string relayState = null, bool bWarnPasswordExpired = false, bool bMultiOptionalFactorEnroll = false) { AuthResponse userAuthClientRsp = null; userAuthClientRsp = _authclient.Authenticate(username, password, relayState, bWarnPasswordExpired, bMultiOptionalFactorEnroll); _logger.Debug("thisAuth status " + userAuthClientRsp.Status); return(userAuthClientRsp); }
async Task <string> SendRequest(Func <HttpRequestMessage> requestFactory, Func <HttpContent> contentFactory) { try { var request = requestFactory(); request.Content = contentFactory(); var response = await client.SendAsync(request, HttpCompletionOption.ResponseContentRead).ConfigureAwait(false); if (response != null) { Debug.WriteLine($"SendRequest returned {response.StatusCode}"); if (response.IsSuccessStatusCode || response.StatusCode == HttpStatusCode.Continue) { //if we get a valid response (non-null, no exception, and not forbidden), then reset our requestRetried var & return the response requestRetried = false; return(await response.Content.ReadAsStringAsync()); } //handle expired auth token if ((response.StatusCode == HttpStatusCode.Forbidden || response.StatusCode == HttpStatusCode.Unauthorized) && !requestRetried) { //attempt to re-auth await AuthClient.Authenticate(true); requestRetried = true; //just so we don't retry endlessly... //re-create the request and copy the content, then send it again return(await SendRequest(requestFactory, () => CopyRequestContent (request.Content))); } else //other bad statuses { var responseContent = await response.Content.ReadAsStringAsync(); throw new Exception($"SendRequest: Non-success status received :: Status Code: {response.StatusCode}; Reason: {response.ReasonPhrase}; Content: {responseContent}"); } } } catch (Exception ex) { Debug.WriteLine("Error in sendRequest: {0}", ex); throw; } throw new Exception("SendRequest: Unable to send successful request - unknown error or null response received"); }
async Task <string> SendRequest(Func <HttpRequestMessage> requestFactory, Func <HttpContent> contentFactory) { try { using (var client = new HttpClient()) { var request = requestFactory(); request.Content = contentFactory(); var response = await client.SendAsync(request).ConfigureAwait(false); if (response != null) { Debug.WriteLine($"SendRequest returned {response.StatusCode}"); if (response.IsSuccessStatusCode) { //if we get a valid response (non-null, no exception, and not forbidden), then reset our requestRetried var & return the response requestRetried = false; return(await response.Content.ReadAsStringAsync()); } //handle expired auth token if ((response.StatusCode == HttpStatusCode.Forbidden || response.StatusCode == HttpStatusCode.Unauthorized) && !requestRetried) { //attempt to re-auth await AuthClient.Authenticate(true); requestRetried = true; //just so we don't retry endlessly... //re-create the request and copy the content, then send it again return(await SendRequest(requestFactory, () => CopyRequestContent (request.Content))); } } } } catch (Exception ex) { Debug.WriteLine("Error in sendRequest: {0}", ex); throw; } Debug.WriteLine("SendRequest: Unable to send successful request, returning null response"); return(null); }
/// <summary> /// Returns Speech to Text results for the given audio input. /// </summary> /// <returns>Detailed Speech to Text results, including the N best results for the given speech input.</returns> /// <param name="audioFilePath">Audio file path.</param> /// <remarks>More info here: https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/bingvoicerecognition#output-format</remarks> public async Task <RecognitionResult> SpeechToTextDetailed(string audioFilePath) { try { await AuthClient.Authenticate(); var response = await SendRequest( () => CreateRequest (OutputMode.Simple), () => PopulateRequestContent (audioFilePath)); var result = JsonConvert.DeserializeObject <RecognitionResult> (response); return(result); } catch (Exception ex) { Debug.WriteLine(ex.Message); throw; } }
/// <summary> /// Returns Speech to Text results for the given audio input. /// </summary> /// <returns>Simple Speech to Text results, which is a single result for the given speech input.</returns> /// <param name="audioStream">Audio stream containing the speech.</param> /// <param name="channelCount">The number of channels in the audio stream.</param> /// <param name="sampleRate">The sample rate of the audio stream.</param> /// <param name="bitsPerSample">The bits per sample of the audio stream.</param> /// <param name="recordingTask">A <see cref="Task"/> that will complete when recording is complete.</param> /// <remarks>More info here: https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/bingvoicerecognition#output-format</remarks> public async Task <RecognitionSpeechResult> SpeechToTextSimple(Stream audioStream, int channelCount, int sampleRate, int bitsPerSample, Task recordingTask = null) { try { await AuthClient.Authenticate(); var response = await SendRequest( () => CreateRequest (OutputMode.Simple), () => PopulateRequestContent (audioStream, channelCount, sampleRate, bitsPerSample, recordingTask)); var result = JsonConvert.DeserializeObject <RecognitionSpeechResult> (response); return(result); } catch (Exception ex) { Debug.WriteLine(ex.Message); throw; } }
/// <summary> /// Calls to the <see cref="AuthEndpoint"/> authentication endpoint to get a JWT token for authentication to the Bing Speech API. Token is cached and valid for 10 minutes. /// </summary> /// <param name="forceNewToken">If set to <c>true</c>, force new token even if there is already a cached token.</param> /// <remarks>This is called automatically when calling any of the SpeechToText* methods. Call this separately up front to decrease latency on the initial API call.</remarks> public async Task AuthenticateWithToken(bool forceNewToken = false) { await AuthClient.Authenticate(forceNewToken); }
protected override void OnAfterTransition(RegulatorState oldState, RegulatorState newState, object data) { switch (newState.Name) { case "AuthLogin": var loginData = (AuthRequest)data; var result = AuthClient.Authenticate(loginData); if (result == null || !result.Valid) { if (result.ReasonText != null) { base.ThrowErrorAndReset(ErrorMessage.FromLiteral(result.ReasonText)); } else if (result.ReasonCode != null) { base.ThrowErrorAndReset(ErrorMessage.FromLiteral( (GameFacade.Strings.GetString("210", result.ReasonCode) ?? "Unknown Error") .Replace("EA.com", AuthClient.BaseUrl.Substring(7).TrimEnd('/')) )); } else { base.ThrowErrorAndReset(new Exception("Unknown error")); } } else { this.AuthResult = result; AsyncTransition("InitialConnect"); } break; case "InitialConnect": try { var connectResult = CityClient.InitialConnectServlet( new InitialConnectServletRequest { Ticket = AuthResult.Ticket, Version = "Version 1.1097.1.0" }); if (connectResult.Status == InitialConnectServletResultType.Authorized) { var cdnurl = connectResult.UserAuthorized.FSOCDNUrl; if (cdnurl != null) { ApiClient.CDNUrl = cdnurl; } if (RequireUpdate(connectResult.UserAuthorized) && !FSOEnvironment.SoftwareKeyboard) { AsyncTransition("UpdateRequired", connectResult.UserAuthorized); } else { AsyncTransition("AvatarData"); } } else if (connectResult.Status == InitialConnectServletResultType.Error) { base.ThrowErrorAndReset(ErrorMessage.FromLiteral(connectResult.Error.Code, connectResult.Error.Message)); } }catch (Exception ex) { base.ThrowErrorAndReset(ex); } break; case "UpdateRequired": break; case "AvatarData": try { Avatars = CityClient.AvatarDataServlet(); AsyncTransition("ShardStatus"); } catch (Exception ex) { base.ThrowErrorAndReset(ex); } break; case "ShardStatus": try { ((ClientShards)Shards).All = CityClient.ShardStatus(); AsyncTransition("LoggedIn"); } catch (Exception ex) { base.ThrowErrorAndReset(ex); } break; case "LoggedIn": FSOFacade.Controller.ShowPersonSelection(); break; } }
public ActionResult PkceRoute() { string userName = Request["userName"]; string passWord = Request["passWord"]; string authnlogin_but = Request["authnlogin_but"]; string oidclogin_but = Request["oidclogin_but"]; string oidc_but = Request["oidc_but"]; string location = Request["location"]; string myStatus = null; string myStateToken; string mySessionToken; string myOktaId = null; AuthResponse userAuthClientRsp; // set relayState string relayState = Request["relayState"]; TempData["relayState"] = relayState; Uri orgUri = new Uri(apiUrl); _orgSettings = new OktaSettings(); _orgSettings.ApiToken = apiToken; _orgSettings.BaseUri = orgUri; _oktaClient = new OktaClient(_orgSettings); _usersClient = new UsersClient(_orgSettings); _authClient = new AuthClient(_orgSettings); try { userAuthClientRsp = _authClient.Authenticate(username: userName, password: passWord, relayState: relayState); logger.Debug("thisAuth status " + userAuthClientRsp.Status); myStatus = userAuthClientRsp.Status; myStateToken = userAuthClientRsp.StateToken; mySessionToken = userAuthClientRsp.SessionToken; if (userAuthClientRsp.Embedded.User != null) { myOktaId = userAuthClientRsp.Embedded.User.Id; } } catch (OktaException ex) { if (ex.ErrorCode == "E0000004") { logger.Debug("Invalid Credentials for User: "******"errMessage"] = "Invalid Credentials for User: "******"E0000085") { logger.Debug("Access Denied by Polciy for User: "******"errMessage"] = "Access Denied by Polciy for User: "******"errMessage"] = "Access Denied by Polciy for User: "******" = " + ex.ErrorCode + ":" + ex.ErrorSummary); // generic failure TempData["errMessage"] = "Sign in process failed!"; } TempData["userName"] = userName; return(RedirectToAction("Login")); } switch (myStatus) { case "PASSWORD_WARN": //password about to expire logger.Debug("PASSWORD_WARN "); break; case "PASSWORD_EXPIRED": //password has expired logger.Debug("PASSWORD_EXPIRED "); break; case "RECOVERY": //user has requested a recovery token logger.Debug("RECOVERY "); break; case "RECOVERY_CHALLENGE": //user must verify factor specific recovery challenge logger.Debug("RECOVERY_CHALLENGE "); break; case "PASSWORD_RESET": //user satified recovery and must now set password logger.Debug("PASSWORD_RESET "); break; case "LOCKED_OUT": //user account is locked, unlock required logger.Debug("LOCKED_OUT "); break; case "MFA_ENROLL": //user must select and enroll an available factor logger.Debug("MFA_ENROLL "); break; case "MFA_ENROLL_ACTIVATE": //user must activate the factor to complete enrollment logger.Debug("MFA_ENROLL_ACTIVATE "); break; case "MFA_REQUIRED": //user must provide second factor with previously enrolled factor logger.Debug("MFA_REQUIRED "); break; case "MFA_CHALLENGE": //use must verify factor specifc challenge logger.Debug("MFA_CHALLENGE "); break; case "SUCCESS": //authentication is complete logger.Debug("SUCCESS"); TempData["errMessage"] = "Authn Login Successful "; TempData["oktaOrg"] = apiUrl; string landingPage = null; if (string.IsNullOrEmpty(relayState)) { landingPage = location + "/AltLanding/UnprotectedLanding"; } else { landingPage = relayState; } //optionaly get session Id locally Session oktaSession = new Okta.Core.Models.Session(); oktaSession = oktaSessionMgmt.CreateSession(mySessionToken); string cookieToken = oktaSession.CookieToken; logger.Debug("session Id " + oktaSession.Id + " for User " + userName); mySessionToken = cookieToken; //exchange sessionToken for sessionCookie in OIDC Implicit workflow Random random = new Random(); string nonceValue = random.Next(99999, 1000000).ToString(); string stateCode = "myStateInfo"; string codeVerifier = oktaOidcHelper.CreateCodeVerifier(); //store codeVerifier for token endpoint cacheService.SavePasscode("myKey", codeVerifier); string codeChallenge = oktaOidcHelper.CreateCodeChallenge(codeVerifier); string oauthUrl = appSettings["oidc.authServer"] + "/v1/authorize?response_type=code&response_mode=query&code_challenge_method=S256&code_challenge=" + codeChallenge + "&client_id=" + appSettings["oidc.spintnative.clientId"] + "&scope=" + appSettings["oidc.scopes"] + "&state=" + stateCode + "&nonce=" + nonceValue + "&redirect_uri=" + appSettings["oidc.spintnative.RedirectUri_PKCE"] + "&sessionToken=" + mySessionToken + "&extra_param=myFavoriteData"; return(Redirect(oauthUrl)); //break; default: logger.Debug("Status: " + myStatus); TempData["errMessage"] = "Status: " + myStatus; break; }//end of switch TempData["userName"] = userName; return(RedirectToAction("UnprotectedLanding", "AltLanding")); }
public ActionResult ImplicitRoute() { string userName = Request["userName"]; string passWord = Request["passWord"]; string authnlogin_but = Request["authnlogin_but"]; string oidclogin_but = Request["oidclogin_but"]; string oidc_but = Request["oidc_but"]; string location = Request["location"]; string myStatus = null; string myStateToken; string mySessionToken; string myOktaId = null; AuthResponse userAuthClientRsp; // set relayState string relayState = Request["relayState"]; TempData["relayState"] = relayState; Uri orgUri = new Uri(apiUrl); _orgSettings = new OktaSettings(); _orgSettings.ApiToken = apiToken; _orgSettings.BaseUri = orgUri; _oktaClient = new OktaClient(_orgSettings); _usersClient = new UsersClient(_orgSettings); _authClient = new AuthClient(_orgSettings); try { userAuthClientRsp = _authClient.Authenticate(username: userName, password: passWord, relayState: relayState); logger.Debug("thisAuth status " + userAuthClientRsp.Status); myStatus = userAuthClientRsp.Status; myStateToken = userAuthClientRsp.StateToken; mySessionToken = userAuthClientRsp.SessionToken; if (userAuthClientRsp.Embedded.User != null) { myOktaId = userAuthClientRsp.Embedded.User.Id; } } catch (OktaException ex) { if (ex.ErrorCode == "E0000004") { logger.Debug("Invalid Credentials for User: "******"errMessage"] = "Invalid Credentials for User: "******"E0000085") { logger.Debug("Access Denied by Polciy for User: "******"errMessage"] = "Access Denied by Polciy for User: "******"errMessage"] = "Access Denied by Polciy for User: "******" = " + ex.ErrorCode + ":" + ex.ErrorSummary); // generic failure TempData["errMessage"] = "Sign in process failed!"; } TempData["userName"] = userName; return(RedirectToAction("Login")); } switch (myStatus) { case "PASSWORD_WARN": //password about to expire logger.Debug("PASSWORD_WARN "); break; case "PASSWORD_EXPIRED": //password has expired logger.Debug("PASSWORD_EXPIRED "); break; case "RECOVERY": //user has requested a recovery token logger.Debug("RECOVERY "); break; case "RECOVERY_CHALLENGE": //user must verify factor specific recovery challenge logger.Debug("RECOVERY_CHALLENGE "); break; case "PASSWORD_RESET": //user satified recovery and must now set password logger.Debug("PASSWORD_RESET "); break; case "LOCKED_OUT": //user account is locked, unlock required logger.Debug("LOCKED_OUT "); break; case "MFA_ENROLL": //user must select and enroll an available factor logger.Debug("MFA_ENROLL "); break; case "MFA_ENROLL_ACTIVATE": //user must activate the factor to complete enrollment logger.Debug("MFA_ENROLL_ACTIVATE "); break; case "MFA_REQUIRED": //user must provide second factor with previously enrolled factor logger.Debug("MFA_REQUIRED "); break; case "MFA_CHALLENGE": //use must verify factor specifc challenge logger.Debug("MFA_CHALLENGE "); break; case "SUCCESS": //authentication is complete logger.Debug("SUCCESS"); TempData["errMessage"] = "Authn Login Successful "; TempData["oktaOrg"] = apiUrl; string landingPage = null; if (string.IsNullOrEmpty(relayState)) { landingPage = location + "/AltLanding/UnprotectedLanding"; } else { landingPage = relayState; } ////optionaly get session Id locally //Session oktaSession = new Okta.Core.Models.Session(); //oktaSession = oktaSessionMgmt.CreateSession(mySessionToken); //string cookieToken = oktaSession.CookieToken; //logger.Debug("session Id " + oktaSession.Id + " for User " + userName); //mySessionToken = cookieToken; //exchange sessionToken for sessionCookie in OIDC Implicit workflow Random random = new Random(); string nonceValue = random.Next(99999, 1000000).ToString(); string stateCode = "myStateInfo"; string oauthUrl = appSettings["oidc.authServer"] + "/v1/authorize?response_type=token id_token&response_mode=form_post&client_id=" + appSettings["oidc.spintweb.clientId"] + "&scope=" + appSettings["oidc.scopes"] + "&state=" + stateCode + " &nonce=" + nonceValue + "&redirect_uri=" + appSettings["oidc.spintweb.RedirectUri"] + "&sessionToken=" + mySessionToken; //string oauthUrl = appSettings["oidc.authServer"] + "/v1/authorize?idp=0oak4qcg796eVYakY0h7&response_type=id_token token&response_mode=form_post&client_id=" + appSettings["oidc.spintweb.clientId"] + "&scope=" + appSettings["oidc.scopes"] + "&state=" + stateCode + " &nonce=" + nonceValue + "&redirect_uri=" + appSettings["oidc.spintweb.RedirectUri"] + "&sessionToken=" + mySessionToken; return(Redirect(oauthUrl)); //NOT Typical //have idToken returned in response //IRestResponse response = null; //var client = new RestClient(MvcApplication.apiUrl + "/oauth2/v1/authorize"); //var request = new RestRequest(Method.GET); //request.AddHeader("Accept", "application/json"); //request.AddHeader("Content-Type", "application/json"); ////request.AddHeader("Authorization", " SSWS " + MvcApplication.apiToken); //request.AddQueryParameter("client_id", appSettings["oidc.spintweb.clientId"]); //request.AddQueryParameter("response_type", "id_token"); ////request.AddQueryParameter("response_type", "token"); //request.AddQueryParameter("response_mode", "okta_post_message"); //request.AddQueryParameter("scope", "openid"); //request.AddQueryParameter("prompt", "none"); //request.AddQueryParameter("redirect_uri", appSettings["oidc.spintweb.RedirectUri"]); //request.AddQueryParameter("state", "myStateInfo"); //request.AddQueryParameter("nonce", "myNonce"); //request.AddQueryParameter("sessionToken", mySessionToken); //response = client.Execute(request); //int myIndex_01 = response.Content.IndexOf("data.id_token ="); //string firstBreak = response.Content.Substring(myIndex_01 + 17); //int myIndex_02 = firstBreak.IndexOf(";"); //int subLength = myIndex_02 - 1; //string myIdToken = firstBreak.Substring(0, subLength); //logger.Debug(myIdToken); //ViewBag.HtmlStr = response.Content; //return View("../AltLanding/MyContent"); // break; default: logger.Debug("Status: " + myStatus); TempData["errMessage"] = "Status: " + myStatus; break; }//end of switch TempData["userName"] = userName; return(RedirectToAction("UnprotectedLanding", "AltLanding")); }