public void CreateGuidForDynamicsObject() { Guid guid1 = GuidUtility.CreateIdForDynamics("Account", "MyAccount"); Assert.Equal(new Guid("601866b1-ff79-56c1-ae09-ba267d5013a2"), guid1); Guid guid2 = GuidUtility.CreateIdForDynamics("Contact", "MyContact"); Assert.Equal(new Guid("b01cc1fb-0e1b-5164-aa34-4cc7d8cf1233"), guid2); Guid guid3 = GuidUtility.CreateIdForDynamics("Account.MyAccount.Contact", "MyContact"); Assert.Equal(new Guid("9e055f91-989f-52e8-a068-ac6ff05a04c8"), guid3); }
/// <summary> /// Process Authentication Request /// </summary> /// <returns></returns> protected override async Task <AuthenticateResult> HandleAuthenticateAsync() { // // get siteminder headers _logger.LogDebug("Parsing the HTTP headers for SiteMinder authentication credential"); _logger.LogInformation("Test information"); _logger.LogTrace("Test Trace"); SiteMinderAuthOptions options = new SiteMinderAuthOptions(); bool isDeveloperLogin = false; bool isBCSCDeveloperLogin = false; try { // IDynamicsClient _dynamicsClient = (IDynamicsClient)context.RequestServices.GetService(typeof(IDynamicsClient)); ClaimsPrincipal principal; HttpContext context = Request.HttpContext; IHostingEnvironment hostingEnv = (IHostingEnvironment)context.RequestServices.GetService(typeof(IHostingEnvironment)); UserSettings userSettings = new UserSettings(); string userId = null; string devCompanyId = null; string siteMinderGuid = ""; string siteMinderBusinessGuid = ""; string siteMinderUserType = ""; // ************************************************** // If this is an Error or Authentiation API - Ignore // ************************************************** string url = context.Request.GetDisplayUrl().ToLower(); if (url.Contains(".js")) { return(AuthenticateResult.NoResult()); } // ************************************************** // Check if the user session is already created // ************************************************** try { _logger.LogInformation("Checking user session"); userSettings = UserSettings.ReadUserSettings(context); _logger.LogDebug("UserSettings found: " + userSettings.GetJson()); } catch { //do nothing _logger.LogDebug("No UserSettings found"); } // is user authenticated - if so we're done if ((userSettings.UserAuthenticated && string.IsNullOrEmpty(userId)) || (userSettings.UserAuthenticated && !string.IsNullOrEmpty(userId) && !string.IsNullOrEmpty(userSettings.UserId) && userSettings.UserId == userId)) { _logger.LogDebug("User already authenticated with active session: " + userSettings.UserId); // Console.WriteLine("User already authenticated with active session: " + userSettings.GetJson()); principal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } string smgov_userdisplayname = context.Request.Headers["smgov_userdisplayname"]; if (!string.IsNullOrEmpty(smgov_userdisplayname)) { userSettings.UserDisplayName = smgov_userdisplayname; } string smgov_businesslegalname = context.Request.Headers["smgov_businesslegalname"]; if (!string.IsNullOrEmpty(smgov_businesslegalname)) { userSettings.BusinessLegalName = smgov_businesslegalname; } // ************************************************** // Authenticate based on SiteMinder Headers // ************************************************** if (string.IsNullOrEmpty(userId)) { _logger.LogDebug("Getting user data from headers"); userId = context.Request.Headers[options.SiteMinderUserNameKey]; if (string.IsNullOrEmpty(userId)) { userId = context.Request.Headers[options.SiteMinderUniversalIdKey]; } siteMinderGuid = context.Request.Headers[options.SiteMinderUserGuidKey]; siteMinderBusinessGuid = context.Request.Headers[options.SiteMinderBusinessGuidKey]; siteMinderUserType = context.Request.Headers[options.SiteMinderUserTypeKey]; // ************************************************** // Validate credentials // ************************************************** if (string.IsNullOrEmpty(userId)) { _logger.LogDebug(options.MissingSiteMinderUserIdError); return(AuthenticateResult.Fail(options.MissingSiteMinderGuidError)); } if (string.IsNullOrEmpty(siteMinderGuid)) { _logger.LogDebug(options.MissingSiteMinderGuidError); return(AuthenticateResult.Fail(options.MissingSiteMinderGuidError)); } if (string.IsNullOrEmpty(siteMinderUserType)) { _logger.LogDebug(options.MissingSiteMinderUserTypeError); return(AuthenticateResult.Fail(options.MissingSiteMinderUserTypeError)); } } else // DEV user, setup a fake session and SiteMinder headers. { if (isDeveloperLogin && _dynamicsResultService != null) { _logger.LogError("Generating a Development user"); userSettings.BusinessLegalName = devCompanyId + " BusinessProfileName"; userSettings.UserDisplayName = userId + " BCeIDContactType"; siteMinderGuid = GuidUtility.CreateIdForDynamics("contact", userSettings.UserDisplayName).ToString(); siteMinderBusinessGuid = GuidUtility.CreateIdForDynamics("account", userSettings.BusinessLegalName).ToString(); siteMinderUserType = "Business"; } else if (isBCSCDeveloperLogin) { _logger.LogError("Generating a Development BC Services user"); userSettings.BusinessLegalName = null; userSettings.UserDisplayName = userId + " Associate"; siteMinderGuid = GuidUtility.CreateIdForDynamics("bcsc", userSettings.UserDisplayName).ToString(); siteMinderBusinessGuid = null; siteMinderUserType = "VerifiedIndividual"; } } if (_dynamicsResultService != null) { var businessBceid = siteMinderBusinessGuid; _logger.LogDebug("We're \"Logged in\", businessBCeID: " + siteMinderBusinessGuid + ", UserBCeID: " + siteMinderGuid); userSettings.AuthenticatedUser = new User(new Guid(siteMinderGuid), "Bill", "Octoroc", true, "BO", "*****@*****.**", siteMinderGuid, siteMinderBusinessGuid, siteMinderUserType, null); userSettings.UserAuthenticated = true; string requestJson = "{\"UserBCeID\":\"" + siteMinderGuid + "\",\"BusinessBCeID\":\"" + siteMinderBusinessGuid + "\"}"; // set the endpoint action string endpointUrl = "vsd_GetCPUOrgContracts"; DynamicsResult result = await _dynamicsResultService.Post(endpointUrl, requestJson); // Console.WriteLine("Dynamics result info:"); string resultString = result.ToString(); string resultResult = result.result.ToString(); string messageString = result.responseMessage.ToString(); int code = (int)result.statusCode; // Console.WriteLine("resultResult"); // Console.WriteLine(resultResult); // Console.WriteLine("messageString"); // Console.WriteLine(messageString); userSettings.UserType = siteMinderUserType; userSettings.UserId = siteMinderGuid; userSettings.AccountId = siteMinderBusinessGuid; //Error: No contact found with the supplied BCeID string NEW_USER = "******"; string NEW_USER_AND_NEW_ORGANIZATION = "No organization and contact found with the supplied BCeID"; string CONTACT_NOT_APPROVED = "Contact is not approved for portal access"; string CONTACT_NOT_CPU = "Contact doesn't belong to CPU"; if (resultResult.Contains(NEW_USER)) { // Console.WriteLine("New User Registration"); userSettings.IsNewUserRegistration = true; userSettings.IsNewUserAndNewOrganizationRegistration = false; principal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); UserSettings.SaveUserSettings(userSettings, context); return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } else if (resultResult.Contains(NEW_USER_AND_NEW_ORGANIZATION)) { // Console.WriteLine("New User and New Organization Registration"); userSettings.IsNewUserRegistration = false; userSettings.IsNewUserAndNewOrganizationRegistration = true; principal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); UserSettings.SaveUserSettings(userSettings, context); return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } else if (resultResult.Contains(CONTACT_NOT_APPROVED)) { //error state - should hopefully never happen // Console.WriteLine("Error, contact already exists but is not approved"); userSettings.ContactExistsButNotApproved = true; principal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); UserSettings.SaveUserSettings(userSettings, context); return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } else if (resultResult.Contains(CONTACT_NOT_CPU)) { //error state - should hopefully never happen // Console.WriteLine("Error, contact does not belong to CPU..."); userSettings.ContactExistsButNotApproved = true; principal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); UserSettings.SaveUserSettings(userSettings, context); return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } else { //TODO - should verify we did in fact get a success response // Console.WriteLine("Found User Data"); // Console.WriteLine("We're \"Logged in\", businessBCeID: " + siteMinderBusinessGuid + ", UserBCeID: " + siteMinderGuid); userSettings.IsNewUserRegistration = false; userSettings.IsNewUserAndNewOrganizationRegistration = false; // Console.WriteLine("UserSettings: " + userSettings.GetJson()); principal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); UserSettings.SaveUserSettings(userSettings, context); return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } } } catch (Exception exception) { _logger.LogError(exception.Message); Console.WriteLine(exception); throw; } return(AuthenticateResult.NoResult()); }
/// <summary> /// Process Authentication Request /// </summary> /// <returns></returns> protected override async Task <AuthenticateResult> HandleAuthenticateAsync() { // get siteminder headers _logger.LogDebug("Parsing the HTTP headers for SiteMinder authentication credential"); SiteMinderAuthOptions options = new SiteMinderAuthOptions(); bool isDeveloperLogin = false; bool isBCSCDeveloperLogin = false; try { ClaimsPrincipal principal; HttpContext context = Request.HttpContext; IDynamicsClient _dynamicsClient = (IDynamicsClient)context.RequestServices.GetService(typeof(IDynamicsClient)); IHostingEnvironment hostingEnv = (IHostingEnvironment)context.RequestServices.GetService(typeof(IHostingEnvironment)); UserSettings userSettings = new UserSettings(); string userId = null; string devCompanyId = null; string siteMinderGuid = ""; string siteMinderBusinessGuid = ""; string siteMinderUserType = ""; // ************************************************** // If this is an Error or Authentiation API - Ignore // ************************************************** string url = context.Request.GetDisplayUrl().ToLower(); if (url.Contains(".js")) { return(AuthenticateResult.NoResult()); } // ************************************************** // Check if we have a Dev Environment Cookie // ************************************************** //if (!hostingEnv.IsProduction()) //{ // check for a fake BCeID login in dev mode string temp = context.Request.Cookies[options.DevAuthenticationTokenKey]; if (string.IsNullOrEmpty(temp)) // could be an automated test user. { temp = context.Request.Headers["DEV-USER"]; } if (!string.IsNullOrEmpty(temp)) { if (temp.Contains("::")) { var temp2 = temp.Split("::"); userId = temp2[0]; if (temp2.Length >= 2) { devCompanyId = temp2[1]; } else { devCompanyId = temp2[0]; } } else { userId = temp; devCompanyId = temp; } isDeveloperLogin = true; _logger.LogDebug("Got user from dev cookie = " + userId + ", company = " + devCompanyId); } else { // same set of tests for a BC Services Card dev login temp = context.Request.Cookies[options.DevBCSCAuthenticationTokenKey]; if (string.IsNullOrEmpty(temp)) // could be an automated test user. { temp = context.Request.Headers["DEV-BCSC-USER"]; } if (!string.IsNullOrEmpty(temp)) { userId = temp; isBCSCDeveloperLogin = true; _logger.LogDebug("Got user from dev cookie = " + userId); } } //} // ************************************************** // Check if the user session is already created // ************************************************** try { _logger.LogInformation("Checking user session"); userSettings = UserSettings.ReadUserSettings(context); _logger.LogDebug("UserSettings found: " + userSettings.GetJson()); } catch { //do nothing _logger.LogDebug("No UserSettings found"); } // is user authenticated - if so we're done if ((userSettings.UserAuthenticated && string.IsNullOrEmpty(userId)) || (userSettings.UserAuthenticated && !string.IsNullOrEmpty(userId) && !string.IsNullOrEmpty(userSettings.UserId) && userSettings.UserId == userId)) { _logger.LogDebug("User already authenticated with active session: " + userSettings.UserId); principal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } string smgov_userdisplayname = context.Request.Headers["smgov_userdisplayname"]; if (!string.IsNullOrEmpty(smgov_userdisplayname)) { userSettings.UserDisplayName = smgov_userdisplayname; } string smgov_businesslegalname = context.Request.Headers["smgov_businesslegalname"]; if (!string.IsNullOrEmpty(smgov_businesslegalname)) { userSettings.BusinessLegalName = smgov_businesslegalname; } // ************************************************** // Authenticate based on SiteMinder Headers // ************************************************** _logger.LogDebug("Parsing the HTTP headers for SiteMinder authentication credential"); // At this point userID would only be set if we are logging in through as a DEV user if (string.IsNullOrEmpty(userId)) { _logger.LogDebug("Getting user data from headers"); userId = context.Request.Headers[options.SiteMinderUserNameKey]; if (string.IsNullOrEmpty(userId)) { userId = context.Request.Headers[options.SiteMinderUniversalIdKey]; } siteMinderGuid = context.Request.Headers[options.SiteMinderUserGuidKey]; siteMinderBusinessGuid = context.Request.Headers[options.SiteMinderBusinessGuidKey]; siteMinderUserType = context.Request.Headers[options.SiteMinderUserTypeKey]; // ************************************************** // Validate credentials // ************************************************** if (string.IsNullOrEmpty(userId)) { _logger.LogDebug(options.MissingSiteMinderUserIdError); return(AuthenticateResult.Fail(options.MissingSiteMinderGuidError)); } if (string.IsNullOrEmpty(siteMinderGuid)) { _logger.LogDebug(options.MissingSiteMinderGuidError); return(AuthenticateResult.Fail(options.MissingSiteMinderGuidError)); } if (string.IsNullOrEmpty(siteMinderUserType)) { _logger.LogDebug(options.MissingSiteMinderUserTypeError); return(AuthenticateResult.Fail(options.MissingSiteMinderUserTypeError)); } } else // DEV user, setup a fake session and SiteMinder headers. { if (isDeveloperLogin && _dynamicsClient != null) { _logger.LogError("Generating a Development user"); userSettings.BusinessLegalName = devCompanyId + " BusinessProfileName"; userSettings.UserDisplayName = userId + " BCeIDContactType"; // search for a matching user. var existingContact = _dynamicsClient.GetContactByName(userId, "BCeIDContactType"); if (existingContact != null) { siteMinderGuid = existingContact.Externaluseridentifier; } else { siteMinderGuid = GuidUtility.CreateIdForDynamics("contact", userSettings.UserDisplayName).ToString(); } var existingBusiness = await _dynamicsClient.GetAccountByLegalName(userSettings.BusinessLegalName); if (existingBusiness != null) { siteMinderBusinessGuid = existingBusiness.BcgovBceid; } { siteMinderBusinessGuid = GuidUtility.CreateIdForDynamics("account", userSettings.BusinessLegalName).ToString(); } siteMinderUserType = "Business"; } else if (isBCSCDeveloperLogin) { _logger.LogError("Generating a Development BC Services user"); userSettings.BusinessLegalName = null; userSettings.UserDisplayName = userId + " Associate"; siteMinderGuid = GuidUtility.CreateIdForDynamics("bcsc", userSettings.UserDisplayName).ToString(); siteMinderBusinessGuid = null; siteMinderUserType = "VerifiedIndividual"; } } // Previously the code would do a database lookup here. However there is no backing database for the users table now, // so we just do a Dynamics lookup on the siteMinderGuid. _logger.LogDebug("Loading user external id = " + siteMinderGuid); if (_dynamicsClient != null) { userSettings.AuthenticatedUser = await _dynamicsClient.LoadUser(siteMinderGuid, context.Request.Headers, _logger); } _logger.LogDebug("After getting authenticated user = "******" (" + userId + ")"); return(AuthenticateResult.Fail(options.InactivegDbUserIdError)); } if (userSettings.AuthenticatedUser != null && !String.IsNullOrEmpty(siteMinderUserType)) { userSettings.AuthenticatedUser.UserType = siteMinderUserType; } userSettings.UserType = siteMinderUserType; // This line gets the various claims for the current user. ClaimsPrincipal userPrincipal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); // ************************************************** // Create authenticated user // ************************************************** _logger.LogDebug("Authentication successful: " + userId); _logger.LogDebug("Setting identity and creating session for: " + userId); // create session info for the current user userSettings.UserId = userId; userSettings.UserAuthenticated = true; userSettings.IsNewUserRegistration = (userSettings.AuthenticatedUser == null); // set other session info userSettings.SiteMinderGuid = siteMinderGuid; userSettings.SiteMinderBusinessGuid = siteMinderBusinessGuid; _logger.LogDebug("Before getting contact and account ids = " + userSettings.GetJson()); if (userSettings.AuthenticatedUser != null) { userSettings.ContactId = userSettings.AuthenticatedUser.ContactId.ToString(); if (siteMinderBusinessGuid != null) // BCeID user { var account = await _dynamicsClient.GetAccountBySiteminderBusinessGuid(siteMinderBusinessGuid); if (account != null && account.Accountid != null) { userSettings.AccountId = account.Accountid; userSettings.AuthenticatedUser.AccountId = Guid.Parse(account.Accountid); } } } if (!hostingEnv.IsProduction() && (isDeveloperLogin || isBCSCDeveloperLogin)) { _logger.LogError("DEV MODE Setting identity and creating session for: " + userId); if (isDeveloperLogin) { userSettings.BusinessLegalName = devCompanyId + " BusinessProfileName"; userSettings.UserDisplayName = userId + " BCeIDContactType"; // add generated guids userSettings.SiteMinderBusinessGuid = GuidUtility.CreateIdForDynamics("account", userSettings.BusinessLegalName).ToString(); userSettings.SiteMinderGuid = GuidUtility.CreateIdForDynamics("contact", userSettings.UserDisplayName).ToString(); } else if (isBCSCDeveloperLogin) { userSettings.BusinessLegalName = null; userSettings.UserDisplayName = userId + " Associate"; // add generated guids userSettings.SiteMinderBusinessGuid = null; userSettings.SiteMinderGuid = GuidUtility.CreateIdForDynamics("bcsc", userSettings.UserDisplayName).ToString(); } if (userSettings.IsNewUserRegistration) { if (isDeveloperLogin) { // add generated guids userSettings.AccountId = userSettings.SiteMinderBusinessGuid; userSettings.ContactId = userSettings.SiteMinderGuid; } else if (isBCSCDeveloperLogin) { // set to null for now userSettings.AccountId = null; userSettings.ContactId = null; } _logger.LogDebug("New user registration:" + userSettings.UserDisplayName); _logger.LogDebug("userSettings.SiteMinderBusinessGuid:" + userSettings.SiteMinderBusinessGuid); _logger.LogDebug("userSettings.SiteMinderGuid:" + userSettings.SiteMinderGuid); _logger.LogDebug("userSettings.AccountId:" + userSettings.AccountId); _logger.LogDebug("userSettings.ContactId:" + userSettings.ContactId); } // Set account ID from authenticated user else if (userSettings.AuthenticatedUser != null) { // populate the business GUID. if (string.IsNullOrEmpty(userSettings.AccountId)) { userSettings.AccountId = userSettings.AuthenticatedUser.AccountId.ToString(); } if (string.IsNullOrEmpty(userSettings.ContactId)) { userSettings.ContactId = userSettings.AuthenticatedUser.ContactId.ToString(); } _logger.LogDebug("Returning user:"******"userSettings.AccountId:" + userSettings.AccountId); _logger.LogDebug("userSettings.ContactId:" + userSettings.ContactId); } } // add the worker settings if it is a new user. if (userSettings.IsNewUserRegistration && userSettings.NewWorker == null) { userSettings.NewWorker = new ViewModels.Worker(); userSettings.NewWorker.CopyHeaderValues(context.Request.Headers); } // add the worker settings if it is a new user. if (userSettings.IsNewUserRegistration && userSettings.NewContact == null) { userSettings.NewContact = new ViewModels.Contact(); userSettings.NewContact.CopyHeaderValues(context.Request.Headers); } // ************************************************** // Update user settings // ************************************************** UserSettings.SaveUserSettings(userSettings, context); // done! principal = userPrincipal; return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } catch (Exception exception) { _logger.LogError(exception.Message); Console.WriteLine(exception); throw; } }
private async Task <AuthenticateResult> LoginDevUser(HttpContext context, IDynamicsClient dynamicsClient) { string userId = null; string devCompanyId = null; bool isDeveloperLogin = false; bool isBCSCDeveloperLogin = false; UserSettings userSettings = new UserSettings(); // check for a fake BCeID login string temp = context.Request.Cookies[_options.DevAuthenticationTokenKey]; if (string.IsNullOrEmpty(temp)) // could be an automated test user. { temp = context.Request.Headers["DEV-USER"]; } if (!string.IsNullOrEmpty(temp)) { if (temp.Contains("::")) { var temp2 = temp.Split("::"); userId = temp2[0]; if (temp2.Length >= 2) { devCompanyId = temp2[1]; } else { devCompanyId = temp2[0]; } } else { userId = temp; devCompanyId = temp; } isDeveloperLogin = true; _logger.Debug("Got user from dev cookie = " + userId + ", company = " + devCompanyId); } else { // same set of tests for a BC Services Card dev login temp = context.Request.Cookies[_options.DevBCSCAuthenticationTokenKey]; if (string.IsNullOrEmpty(temp)) // could be an automated test user. { temp = context.Request.Headers["DEV-BCSC-USER"]; } if (!string.IsNullOrEmpty(temp)) { userId = temp; isBCSCDeveloperLogin = true; _logger.Debug("Got user from dev cookie = " + userId); } } if (isDeveloperLogin) { _logger.Debug("Generating a Development user"); userSettings.BusinessLegalName = devCompanyId + " TestBusiness"; userSettings.UserDisplayName = userId + " TestUser"; userSettings.SiteMinderGuid = GuidUtility.CreateIdForDynamics("contact", userSettings.UserDisplayName).ToString(); userSettings.SiteMinderBusinessGuid = GuidUtility.CreateIdForDynamics("account", userSettings.BusinessLegalName).ToString(); userSettings.UserType = "Business"; } else if (isBCSCDeveloperLogin) { _logger.Debug("Generating a Development BC Services user"); userSettings.BusinessLegalName = null; userSettings.UserDisplayName = userId + " Associate"; userSettings.SiteMinderGuid = GuidUtility.CreateIdForDynamics("bcsc", userSettings.UserDisplayName).ToString(); userSettings.SiteMinderBusinessGuid = null; userSettings.UserType = "VerifiedIndividual"; } NameValueCollection queryStringParams = HttpUtility.ParseQueryString(context.Request.QueryString.ToString()); if (queryStringParams.Get("path") == "cannabis-associate-screening" && queryStringParams.Get("success") == "false") { context.Request.Headers.Add("smgov_givenname", "NORMAN"); context.Request.Headers.Add("smgov_givennames", "Norman Percevel "); context.Request.Headers.Add("smgov_useremail", "*****@*****.**"); context.Request.Headers.Add("smgov_birthdate", "1986-12-03"); context.Request.Headers.Add("smgov_sex", "Male"); context.Request.Headers.Add("smgov_streetaddress", "2000 STORMAN ROW"); context.Request.Headers.Add("smgov_city", "PENTICTON"); context.Request.Headers.Add("smgov_postalcode", "V8V8V8"); context.Request.Headers.Add("smgov_province", "BC"); context.Request.Headers.Add("smgov_country", "CA"); context.Request.Headers.Add("smgov_surname", "ROCKWELL"); userSettings.UserDisplayName = "NORMAN ROCKWELL"; } else if (queryStringParams.Get("path") == "cannabis-associate-screening") { context.Request.Headers.Add("smgov_givenname", "JOE"); context.Request.Headers.Add("smgov_givennames", "Joe Shmoe "); context.Request.Headers.Add("smgov_useremail", "*****@*****.**"); context.Request.Headers.Add("smgov_birthdate", "1986-12-03"); context.Request.Headers.Add("smgov_sex", "Male"); context.Request.Headers.Add("smgov_streetaddress", "2000 COLONIAL ROW"); context.Request.Headers.Add("smgov_city", "PENTICTON"); context.Request.Headers.Add("smgov_postalcode", "V2A7P4"); context.Request.Headers.Add("smgov_province", "BC"); context.Request.Headers.Add("smgov_country", "CA"); context.Request.Headers.Add("smgov_surname", "ONE"); userSettings.UserDisplayName = "JOE ONE"; userSettings.ContactId = "3c254b30-ebf2-ea11-b81d-00505683fbf4"; } _logger.Debug("DEV MODE Setting identity and creating session for: " + userId); // create session info for the current user userSettings.AuthenticatedUser = await _dynamicsClient.LoadUser(userSettings.SiteMinderGuid, context.Request.Headers, _ms_logger); if (userSettings.AuthenticatedUser == null) { userSettings.UserAuthenticated = true; userSettings.IsNewUserRegistration = true; } else { userSettings.AuthenticatedUser.UserType = userSettings.UserType; userSettings.AccountId = userSettings.AuthenticatedUser.AccountId.ToString(); userSettings.ContactId = userSettings.AuthenticatedUser.ContactId.ToString(); userSettings.UserAuthenticated = true; userSettings.IsNewUserRegistration = false; } userSettings.UserId = userId; ClaimsPrincipal userPrincipal = userSettings.AuthenticatedUser.ToClaimsPrincipal(_options.Scheme, userSettings.UserType); UserSettings.SaveUserSettings(userSettings, context); return(AuthenticateResult.Success(new AuthenticationTicket(userPrincipal, null, _options.Scheme))); }
/// <summary> /// Process Authentication Request /// </summary> /// <returns></returns> protected override async Task <AuthenticateResult> HandleAuthenticateAsync() { // get siteminder headers _logger.LogDebug("Parsing the HTTP headers for SiteMinder authentication credential"); SiteMinderAuthOptions options = new SiteMinderAuthOptions(); bool isDeveloperLogin = false; bool isBCSCDeveloperLogin = false; try { ClaimsPrincipal principal; HttpContext context = Request.HttpContext; IConfiguration _configuration = (IConfiguration)context.RequestServices.GetService(typeof(IConfiguration)); IDynamicsClient _dynamicsClient = (IDynamicsClient)context.RequestServices.GetService(typeof(IDynamicsClient)); FileManagerClient _fileManagerClient = (FileManagerClient)context.RequestServices.GetService(typeof(FileManagerClient)); IWebHostEnvironment hostingEnv = (IWebHostEnvironment)context.RequestServices.GetService(typeof(IWebHostEnvironment)); UserSettings userSettings = new UserSettings(); if (!string.IsNullOrEmpty(_configuration["FEATURE_DISABLE_LOGIN"])) { return(AuthenticateResult.Fail(options.LoginDisabledError)); } string userId = null; string devCompanyId = null; string siteMinderGuid = ""; string siteMinderBusinessGuid = ""; string siteMinderUserType = ""; // ************************************************** // If this is an Error or Authentiation API - Ignore // ************************************************** string url = context.Request.GetDisplayUrl().ToLower(); if (url.Contains(".js")) { return(AuthenticateResult.NoResult()); } // ************************************************** // Check if we have a Dev Environment Cookie // ************************************************** if (!hostingEnv.IsProduction()) { // check for a fake BCeID login in dev mode string temp = context.Request.Cookies[options.DevAuthenticationTokenKey]; if (string.IsNullOrEmpty(temp)) // could be an automated test user. { temp = context.Request.Headers["DEV-USER"]; } if (!string.IsNullOrEmpty(temp)) { if (temp.Contains("::")) { var temp2 = temp.Split("::"); userId = temp2[0]; if (temp2.Length >= 2) { devCompanyId = temp2[1]; } else { devCompanyId = temp2[0]; } } else { userId = temp; devCompanyId = temp; } isDeveloperLogin = true; _logger.LogDebug("Got user from dev cookie = " + userId + ", company = " + devCompanyId); } else { // same set of tests for a BC Services Card dev login temp = context.Request.Cookies[options.DevBCSCAuthenticationTokenKey]; if (string.IsNullOrEmpty(temp)) // could be an automated test user. { temp = context.Request.Headers["DEV-BCSC-USER"]; } if (!string.IsNullOrEmpty(temp)) { userId = temp; isBCSCDeveloperLogin = true; _logger.LogDebug("Got user from dev cookie = " + userId); } } } // ************************************************** // Check if the user session is already created // ************************************************** try { _logger.LogDebug("Checking user session"); userSettings = UserSettings.ReadUserSettings(context); _logger.LogDebug("UserSettings found: " + userSettings.GetJson()); } catch { //do nothing _logger.LogDebug("No UserSettings found"); } // is user authenticated - if so we're done if ((userSettings.UserAuthenticated && string.IsNullOrEmpty(userId)) || (userSettings.UserAuthenticated && !string.IsNullOrEmpty(userId) && !string.IsNullOrEmpty(userSettings.UserId) && userSettings.UserId == userId)) { _logger.LogDebug("User already authenticated with active session: " + userSettings.UserId); principal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } string smgov_userdisplayname = context.Request.Headers["smgov_userdisplayname"]; if (!string.IsNullOrEmpty(smgov_userdisplayname)) { userSettings.UserDisplayName = smgov_userdisplayname; } string smgov_businesslegalname = context.Request.Headers["smgov_businesslegalname"]; if (!string.IsNullOrEmpty(smgov_businesslegalname)) { userSettings.BusinessLegalName = smgov_businesslegalname; } // ************************************************** // Authenticate based on SiteMinder Headers // ************************************************** _logger.LogDebug("Parsing the HTTP headers for SiteMinder authentication credential"); // At this point userID would only be set if we are logging in through as a DEV user if (string.IsNullOrEmpty(userId)) { _logger.LogDebug("Getting user data from headers"); userId = context.Request.Headers[options.SiteMinderUserNameKey]; if (string.IsNullOrEmpty(userId)) { userId = context.Request.Headers[options.SiteMinderUniversalIdKey]; } siteMinderGuid = context.Request.Headers[options.SiteMinderUserGuidKey]; siteMinderBusinessGuid = context.Request.Headers[options.SiteMinderBusinessGuidKey]; siteMinderUserType = context.Request.Headers[options.SiteMinderUserTypeKey]; // ************************************************** // Validate credentials // ************************************************** if (string.IsNullOrEmpty(userId)) { _logger.LogDebug(options.MissingSiteMinderUserIdError); return(AuthenticateResult.Fail(options.MissingSiteMinderGuidError)); } if (string.IsNullOrEmpty(siteMinderGuid)) { _logger.LogDebug(options.MissingSiteMinderGuidError); return(AuthenticateResult.Fail(options.MissingSiteMinderGuidError)); } if (string.IsNullOrEmpty(siteMinderUserType)) { _logger.LogDebug(options.MissingSiteMinderUserTypeError); return(AuthenticateResult.Fail(options.MissingSiteMinderUserTypeError)); } } else // DEV user, setup a fake session and SiteMinder headers. { if (isDeveloperLogin) { _logger.LogDebug("Generating a Development user"); userSettings.BusinessLegalName = devCompanyId + " TestBusiness"; userSettings.UserDisplayName = userId + " TestUser"; siteMinderGuid = GuidUtility.CreateIdForDynamics("contact", userSettings.UserDisplayName).ToString(); siteMinderBusinessGuid = GuidUtility.CreateIdForDynamics("account", userSettings.BusinessLegalName).ToString(); siteMinderUserType = "Business"; } else if (isBCSCDeveloperLogin) { _logger.LogDebug("Generating a Development BC Services user"); userSettings.BusinessLegalName = null; userSettings.UserDisplayName = userId + " Associate"; siteMinderGuid = GuidUtility.CreateIdForDynamics("bcsc", userSettings.UserDisplayName).ToString(); siteMinderBusinessGuid = null; siteMinderUserType = "VerifiedIndividual"; } } // Previously the code would do a database lookup here. However there is no backing database for the users table now, // so we just do a Dynamics lookup on the siteMinderGuid. _logger.LogDebug("Loading user external id = " + siteMinderGuid); // 3/18/2020 - Note that LoadUser will now work if there is a match on the guid, as well as a match on name in a case where there is no guid. userSettings.AuthenticatedUser = await _dynamicsClient.LoadUser(siteMinderGuid, context.Request.Headers, _logger); _logger.LogDebug("After getting authenticated user = "******" (" + userId + ")"); return(AuthenticateResult.Fail(options.InactivegDbUserIdError)); } if (userSettings.AuthenticatedUser != null && !String.IsNullOrEmpty(siteMinderUserType)) { userSettings.AuthenticatedUser.UserType = siteMinderUserType; } userSettings.UserType = siteMinderUserType; // This line gets the various claims for the current user. ClaimsPrincipal userPrincipal = userSettings.AuthenticatedUser.ToClaimsPrincipal(options.Scheme, userSettings.UserType); // ************************************************** // Create authenticated user // ************************************************** _logger.LogDebug("Authentication successful: " + userId); _logger.LogDebug("Setting identity and creating session for: " + userId); // create session info for the current user userSettings.UserId = userId; userSettings.UserAuthenticated = true; userSettings.IsNewUserRegistration = userSettings.AuthenticatedUser == null; // set other session info userSettings.SiteMinderGuid = siteMinderGuid; userSettings.SiteMinderBusinessGuid = siteMinderBusinessGuid; _logger.LogDebug("Before getting contact and account ids = " + userSettings.GetJson()); if (userSettings.AuthenticatedUser != null) { userSettings.ContactId = userSettings.AuthenticatedUser.ContactId.ToString(); // ensure that the given account has a documents folder. if (siteMinderBusinessGuid != null) // BCeID user { var contact = _dynamicsClient.GetContactByExternalId(userSettings.ContactId); if (contact == null) { // try by other means. var contactVM = new Public.ViewModels.Contact(); contactVM.CopyHeaderValues(context.Request.Headers); contact = _dynamicsClient.GetContactByContactVmBlankSmGuid(contactVM); } if (contact != null && contact.Contactid != null) { await CreateContactDocumentLocation(_dynamicsClient, _fileManagerClient, contact); } var account = await _dynamicsClient.GetAccountBySiteminderBusinessGuid(siteMinderBusinessGuid); if (account == null) { // try by other means. account = _dynamicsClient.GetAccountByLegalName(userSettings.BusinessLegalName); } if (account != null && account.Accountid != null) { userSettings.AccountId = account.Accountid; userSettings.AuthenticatedUser.AccountId = Guid.Parse(account.Accountid); // ensure that the given account has a documents folder. await CreateAccountDocumentLocation(_dynamicsClient, _fileManagerClient, account); } } } if (!hostingEnv.IsProduction() && (isDeveloperLogin || isBCSCDeveloperLogin)) { _logger.LogDebug("DEV MODE Setting identity and creating session for: " + userId); if (isDeveloperLogin) { userSettings.BusinessLegalName = devCompanyId + " TestBusiness"; userSettings.UserDisplayName = userId + " TestUser"; // add generated guids userSettings.SiteMinderBusinessGuid = GuidUtility.CreateIdForDynamics("account", userSettings.BusinessLegalName).ToString(); userSettings.SiteMinderGuid = GuidUtility.CreateIdForDynamics("contact", userSettings.UserDisplayName).ToString(); } else if (isBCSCDeveloperLogin) { userSettings.BusinessLegalName = null; userSettings.UserDisplayName = userId + " Associate"; // add generated guids userSettings.SiteMinderBusinessGuid = null; userSettings.SiteMinderGuid = GuidUtility.CreateIdForDynamics("bcsc", userSettings.UserDisplayName).ToString(); } if (userSettings.IsNewUserRegistration) { if (isDeveloperLogin) { // add generated guids // set to null to indicate that the user is still registering the account userSettings.AccountId = null; userSettings.ContactId = null; } else if (isBCSCDeveloperLogin) { // set to null for now userSettings.AccountId = null; userSettings.ContactId = null; } _logger.LogDebug("New user registration:" + userSettings.UserDisplayName); _logger.LogDebug("userSettings.SiteMinderBusinessGuid:" + userSettings.SiteMinderBusinessGuid); _logger.LogDebug("userSettings.SiteMinderGuid:" + userSettings.SiteMinderGuid); _logger.LogDebug("userSettings.AccountId:" + userSettings.AccountId); _logger.LogDebug("userSettings.ContactId:" + userSettings.ContactId); } // Set account ID from authenticated user else if (userSettings.AuthenticatedUser != null) { // populate the business GUID. if (string.IsNullOrEmpty(userSettings.AccountId)) { userSettings.AccountId = userSettings.AuthenticatedUser.AccountId.ToString(); } if (string.IsNullOrEmpty(userSettings.ContactId)) { userSettings.ContactId = userSettings.AuthenticatedUser.ContactId.ToString(); } _logger.LogDebug("Returning user:"******"userSettings.AccountId:" + userSettings.AccountId); _logger.LogDebug("userSettings.ContactId:" + userSettings.ContactId); } } // add the worker settings if it is a new user. if (userSettings.IsNewUserRegistration) { userSettings.NewWorker = new ViewModels.Worker(); userSettings.NewWorker.CopyHeaderValues(context.Request.Headers); userSettings.NewContact = new ViewModels.Contact(); userSettings.NewContact.CopyHeaderValues(context.Request.Headers); if (isBCSCDeveloperLogin) { userSettings.NewWorker.firstname = userId; userSettings.NewWorker.lastname = "Associate"; userSettings.NewContact.firstname = userId; userSettings.NewContact.lastname = "Associate"; } } else if (siteMinderUserType == "VerifiedIndividual") { // Verified individual is from BC Service Card which means it's a worker // Update contact and worker with latest info from BC Service Card MicrosoftDynamicsCRMadoxioWorkerCollection workerCollection = _dynamicsClient.Workers.Get(filter: $"_adoxio_contactid_value eq {userSettings.ContactId}"); if (workerCollection.Value.Count > 0) { MicrosoftDynamicsCRMadoxioWorker savedWorker = workerCollection.Value[0]; ViewModels.Contact contact = new ViewModels.Contact(); contact.CopyHeaderValues(context.Request.Headers); MicrosoftDynamicsCRMcontact savedContact = _dynamicsClient.Contacts.GetByKey(userSettings.ContactId); if (savedContact.Address1Line1 != null && savedContact.Address1Line1 != contact.address1_line1) { MicrosoftDynamicsCRMadoxioPreviousaddress prevAddress = new MicrosoftDynamicsCRMadoxioPreviousaddress() { AdoxioStreetaddress = savedContact.Address1Line1, AdoxioProvstate = savedContact.Address1Stateorprovince, AdoxioCity = savedContact.Address1City, AdoxioCountry = savedContact.Address1Country, AdoxioPostalcode = savedContact.Address1Postalcode, ContactIdODataBind = _dynamicsClient.GetEntityURI("contacts", savedContact.Contactid) }; _dynamicsClient.Previousaddresses.Create(prevAddress); } _dynamicsClient.Contacts.Update(userSettings.ContactId, contact.ToModel()); ViewModels.Worker worker = new ViewModels.Worker(); worker.CopyHeaderValues(context.Request.Headers); MicrosoftDynamicsCRMadoxioWorker patchWorker = new MicrosoftDynamicsCRMadoxioWorker() { AdoxioFirstname = worker.firstname, AdoxioLastname = worker.lastname, AdoxioMiddlename = worker.middlename }; if (worker.gender != 0) { patchWorker.AdoxioGendercode = (int)worker.gender; } _dynamicsClient.Workers.Update(savedWorker.AdoxioWorkerid, patchWorker); var updatedWorker = await _dynamicsClient.GetWorkerByIdWithChildren(savedWorker.AdoxioWorkerid); // only create the worker document location if the FEATURE_NO_WET_SIGNATURE setting is blank if (string.IsNullOrEmpty(_configuration["FEATURE_NO_WET_SIGNATURE"])) { // ensure that the worker has a documents folder. await CreateWorkerDocumentLocation(_dynamicsClient, _fileManagerClient, updatedWorker); } } } // ************************************************** // Update user settings // ************************************************** UserSettings.SaveUserSettings(userSettings, context); // done! principal = userPrincipal; return(AuthenticateResult.Success(new AuthenticationTicket(principal, null, Options.Scheme))); } catch (Exception exception) { _logger.LogError(exception.Message); throw; } }