in Microsoft.Dynamics365.UIAutomation.Api.UCI/WebClient.cs [141:202]
private LoginResult Login(IWebDriver driver, Uri uri, SecureString username, SecureString password, SecureString mfaSecretKey = null, Action<LoginRedirectEventArgs> redirectAction = null)
{
bool online = !(OnlineDomains != null && !OnlineDomains.Any(d => uri.Host.EndsWith(d)));
driver.Navigate().GoToUrl(uri);
if (!online)
return LoginResult.Success;
driver.ClickIfVisible(By.Id(Elements.ElementId[Reference.Login.UseAnotherAccount]));
bool waitingForOtc = false;
bool success = EnterUserName(driver, username);
if (!success)
{
var isUserAlreadyLogged = IsUserAlreadyLogged();
if (isUserAlreadyLogged)
{
SwitchToDefaultContent(driver);
return LoginResult.Success;
}
ThinkTime(1000);
waitingForOtc = GetOtcInput(driver) != null;
if (!waitingForOtc)
throw new Exception($"Login page failed. {Reference.Login.UserId} not found.");
}
if (!waitingForOtc)
{
driver.ClickIfVisible(By.Id("aadTile"));
ThinkTime(1000);
//If expecting redirect then wait for redirect to trigger
if (redirectAction != null)
{
//Wait for redirect to occur.
ThinkTime(3000);
redirectAction.Invoke(new LoginRedirectEventArgs(username, password, driver));
return LoginResult.Redirect;
}
EnterPassword(driver, password);
ThinkTime(1000);
}
int attempts = 0;
bool entered;
do
{
entered = EnterOneTimeCode(driver, mfaSecretKey);
success = ClickStaySignedIn(driver) || IsUserAlreadyLogged();
attempts++;
}
while (!success && attempts <= Constants.DefaultRetryAttempts); // retry to enter the otc-code, if its fail & it is requested again
if (entered && !success)
throw new InvalidOperationException("Something went wrong entering the OTC. Please check the MFA-SecretKey in configuration.");
return success ? LoginResult.Success : LoginResult.Failure;
}