/// <summary> /// Attempts to log the user in /// </summary> /// <param name="parameter">The <see cref="SecureString"/> passed in from the view for the users password</param> /// <returns></returns> public async Task LoginAsync(object parameter) { await RunCommandAsync(() => LoginIsRunning, async() => { var pass = (parameter as IHavePassword).SecurePassword.Unsecure(); var adM = new AdfsAuth(); var isAuthenticated = await Task.Run(() => adM.ValidateCredentials(Email, pass)); //#if DEBUG // isAuthenticated = true; //#endif MessageBox.Show(isAuthenticated ? "Successfully Authenticated using ADFS" : "Couldn't Authenticated using ADFS"); if (!isAuthenticated) { return; } var user = Task.Run(() => adM.GetUserDetails(Email)); await user; if (user.Result != null) { LoggedInUserData.LogInUser(user.Result.UserName, user.Result.FirstName, user.Result.LastName, user.Result.UserType, user.Result.UserId); IoC.Get <ApplicationViewModel>().LoggedInUser = user.Result.FirstName + ' ' + user.Result.LastName; IoC.Get <ApplicationViewModel>().GoToPage(ApplicationPage.Dashboard); } }); }
private async Task GetAdfsAuth(string adfsUrl, string clientId, string clientSecret, string crmUrl, string userName, string password, Func <AdfsAuth, Task> action) { var strKey = GenerateKeyString(adfsUrl, clientId, clientSecret, crmUrl, userName, password); if (!_adfsAuthContexts.TryGetValue(strKey, out AdfsAuthWrapperContainer wrapperContainer)) { SharePool <AdfsAuthWrapper> wrapperPool = new SharePool <AdfsAuthWrapper>("Adfs", () => { return(null); }, (wrapper) => { return(true); } , (wrapper) => { }, async() => { var auth = await AdfsHelper.GetAdfsAuthDirect(adfsUrl, $"{crmUrl}/api/data", clientId, clientSecret, userName, password); AdfsAuthWrapper wrapper = new AdfsAuthWrapper() { AdfsAuth = auth, AdfsParameter = new AdfsParameter() { AdfsUrl = adfsUrl, ClientId = clientId, CrmUrl = crmUrl, ClientSecret = clientSecret, UserName = userName, Password = password }, CreateTime = DateTime.UtcNow, TokenCreateTime = DateTime.UtcNow }; return(wrapper); } , async(wrapper) => { if ((DateTime.UtcNow - wrapper.CreateTime).TotalSeconds > _refreashTokenTimeout - 100) { return(await Task.FromResult(false)); } return(await Task.FromResult(true)); } , async(wrapper) => { await Task.FromResult(0); }, _poolLimit ); wrapperContainer = new AdfsAuthWrapperContainer() { ContextPool = wrapperPool, LastTime = DateTime.UtcNow }; lock (_adfsAuthContexts) { if (_adfsAuthContexts.Count > _limit) { var deleteItem = (from item in _adfsAuthContexts orderby item.Value.LastTime select item ).FirstOrDefault(); if (deleteItem.Key != null) { _adfsAuthContexts.Remove(deleteItem.Key); } } _adfsAuthContexts[strKey] = wrapperContainer; } } AdfsAuthWrapper adfsAuthWrapper = null; AdfsAuth adfsAuth = null; adfsAuthWrapper = await wrapperContainer.ContextPool.GetAsync(); if ((DateTime.UtcNow - adfsAuthWrapper.TokenCreateTime).TotalSeconds > adfsAuthWrapper.AdfsAuth.Expires - 20) { adfsAuth = await AdfsHelper.RefreshToken(adfsAuthWrapper.AdfsParameter.AdfsUrl, clientId, clientSecret, adfsAuthWrapper.AdfsAuth.RefreshToken); adfsAuthWrapper.AdfsAuth = adfsAuth; adfsAuthWrapper.TokenCreateTime = DateTime.UtcNow; } else { adfsAuth = adfsAuthWrapper.AdfsAuth; } await action(adfsAuth); }