public Intent GetIntentForBrokerActivity(AuthenticationRequest request, Activity callerActivity) { Intent intent = null; IAccountManagerFuture result = null; try { // Callback is not passed since it is making a blocking call to get // intent. Activity needs to be launched from calling app // to get the calling app's metadata if needed at BrokerActivity. Bundle addAccountOptions = GetBrokerOptions(request); result = mAcctManager.AddAccount(BrokerConstants.BrokerAccountType, BrokerConstants.AuthtokenType, null, addAccountOptions, null, null, new Handler(callerActivity.MainLooper)); // Making blocking request here Bundle bundleResult = (Bundle)result.Result; // Authenticator should throw OperationCanceledException if // token is not available intent = (Intent)bundleResult.GetParcelable(AccountManager.KeyIntent); // Add flag to this intent to signal that request is for broker // logic if (intent != null) { intent.PutExtra(BrokerConstants.BrokerRequest, BrokerConstants.BrokerRequest); } } catch (OperationCanceledException e) { PlatformPlugin.Logger.Error(null, e); } catch (Exception e) { // Authenticator gets problem from webrequest or file read/write PlatformPlugin.Logger.Error(null, new AdalException("Authenticator cancels the request", e)); } return(intent); }
public void AcquireToken(IDictionary <string, string> brokerPayload) { if (brokerPayload.ContainsKey("broker_install_url")) { string url = brokerPayload["broker_install_url"]; Uri uri = new Uri(url); string query = uri.Query; if (query.StartsWith("?")) { query = query.Substring(1); } Dictionary <string, string> keyPair = EncodingHelper.ParseKeyValueList(query, '&', true, false, null); PlatformParameters pp = PlatformParameters as PlatformParameters; pp.CallerActivity.StartActivity(new Intent(Intent.ActionView, Android.Net.Uri.Parse(keyPair["app_link"]))); throw new AdalException(AdalErrorAndroidEx.BrokerApplicationRequired, AdalErrorMessageAndroidEx.BrokerApplicationRequired); } Context mContext = Application.Context; AuthenticationRequest request = new AuthenticationRequest(brokerPayload); PlatformParameters platformParams = PlatformParameters as PlatformParameters; // BROKER flow intercepts here // cache and refresh call happens through the authenticator service if (mBrokerProxy.VerifyUser(request.LoginHint, request.UserId)) { PlatformPlugin.Logger.Verbose(null, "It switched to broker for context: " + mContext.PackageName); request.BrokerAccountName = request.LoginHint; // Don't send background request, if prompt flag is always or // refresh_session if (!string.IsNullOrEmpty(request.BrokerAccountName) || !string.IsNullOrEmpty(request.UserId)) { PlatformPlugin.Logger.Verbose(null, "User is specified for background token request"); resultEx = mBrokerProxy.GetAuthTokenInBackground(request, platformParams.CallerActivity); } else { PlatformPlugin.Logger.Verbose(null, "User is not specified for background token request"); } if (resultEx != null && resultEx.Result != null && !string.IsNullOrEmpty(resultEx.Result.AccessToken)) { PlatformPlugin.Logger.Verbose(null, "Token is returned from background call "); readyForResponse.Release(); return; } // Launch broker activity // if cache and refresh request is not handled. // Initial request to authenticator needs to launch activity to // record calling uid for the account. This happens for Prompt auto // or always behavior. PlatformPlugin.Logger.Verbose(null, "Token is not returned from backgroud call"); // Only happens with callback since silent call does not show UI PlatformPlugin.Logger.Verbose(null, "Launch activity for Authenticator"); PlatformPlugin.Logger.Verbose(null, "Starting Authentication Activity"); if (resultEx == null) { PlatformPlugin.Logger.Verbose(null, "Initial request to authenticator"); // Log the initial request but not force a prompt } if (brokerPayload.ContainsKey("silent_broker_flow")) { throw new AdalSilentTokenAcquisitionException(); } // onActivityResult will receive the response // Activity needs to launch to record calling app for this // account Intent brokerIntent = mBrokerProxy.GetIntentForBrokerActivity(request, platformParams.CallerActivity); if (brokerIntent != null) { try { PlatformPlugin.Logger.Verbose(null, "Calling activity pid:" + Android.OS.Process.MyPid() + " tid:" + Android.OS.Process.MyTid() + "uid:" + Android.OS.Process.MyUid()); platformParams.CallerActivity.StartActivityForResult(brokerIntent, 1001); } catch (ActivityNotFoundException e) { PlatformPlugin.Logger.Error(null, e); } } } else { throw new AdalException(AdalErrorAndroidEx.NoBrokerAccountFound, "Add requested account as a Workplace account via Settings->Accounts or set UseBroker=true."); } }
public AuthenticationResultEx GetAuthTokenInBackground(AuthenticationRequest request, Activity callerActivity) { AuthenticationResultEx authResult = null; VerifyNotOnMainThread(); // if there is not any user added to account, it returns empty Account targetAccount = null; Account[] accountList = mAcctManager .GetAccountsByType(BrokerConstants.BrokerAccountType); if (!String.IsNullOrEmpty(request.BrokerAccountName)) { targetAccount = FindAccount(request.BrokerAccountName, accountList); } else { try { UserInfo[] users = GetBrokerUsers(); UserInfo matchingUser = FindUserInfo(request.UserId, users); if (matchingUser != null) { targetAccount = FindAccount(matchingUser.DisplayableId, accountList); } } catch (Exception e) { PlatformPlugin.Logger.Error(null, e); } } if (targetAccount != null) { Bundle brokerOptions = GetBrokerOptions(request); // blocking call to get token from cache or refresh request in // background at Authenticator IAccountManagerFuture result = null; try { // It does not expect activity to be launched. // AuthenticatorService is handling the request at // AccountManager. // result = mAcctManager.GetAuthToken(targetAccount, BrokerConstants.AuthtokenType, brokerOptions, false, null /* * set to null to avoid callback */, new Handler(callerActivity.MainLooper)); // Making blocking request here PlatformPlugin.Logger.Verbose(null, "Received result from Authenticator"); Bundle bundleResult = (Bundle)result.GetResult(10000, TimeUnit.Milliseconds); // Authenticator should throw OperationCanceledException if // token is not available authResult = GetResultFromBrokerResponse(bundleResult); } catch (OperationCanceledException e) { PlatformPlugin.Logger.Error(null, e); } catch (AuthenticatorException e) { PlatformPlugin.Logger.Error(null, e); } catch (Exception e) { // Authenticator gets problem from webrequest or file read/write /* Logger.e(TAG, "Authenticator cancels the request", "", * ADALError.BROKER_AUTHENTICATOR_IO_EXCEPTION);*/ PlatformPlugin.Logger.Error(null, e); } PlatformPlugin.Logger.Verbose(null, "Returning result from Authenticator"); return(authResult); } else { PlatformPlugin.Logger.Verbose(null, "Target account is not found"); } return(null); }