public static IKeystoneUser SyncLocalAccountStore(IKeystoneUserClaims keystoneUserClaims, IIdentity userIdentity) { SitkaHttpApplication.Logger.DebugFormat("In SyncLocalAccountStore - User '{0}', Authenticated = '{1}'", userIdentity.Name, userIdentity.IsAuthenticated); var sendNewUserNotification = false; var sendNewOrganizationNotification = false; var person = HttpRequestStorage.DatabaseEntities.People.GetPersonByPersonGuid(keystoneUserClaims.UserGuid); if (person == null) { // new user - provision with limited role SitkaHttpApplication.Logger.DebugFormat( "In SyncLocalAccountStore - creating local profile for User '{0}'", keystoneUserClaims.UserGuid); var unknownOrganization = HttpRequestStorage.DatabaseEntities.Organizations.GetUnknownOrganization(); person = new Person(keystoneUserClaims.UserGuid, keystoneUserClaims.FirstName, keystoneUserClaims.LastName, keystoneUserClaims.Email, Role.Unassigned.RoleID, DateTime.Now, true, unknownOrganization.OrganizationID, false, keystoneUserClaims.LoginName, false, Guid.NewGuid()); HttpRequestStorage.DatabaseEntities.People.Add(person); sendNewUserNotification = true; } else { // existing user - sync values SitkaHttpApplication.Logger.DebugFormat( "In SyncLocalAccountStore - syncing local profile for User '{0}'", keystoneUserClaims.UserGuid); } person.FirstName = keystoneUserClaims.FirstName; person.LastName = keystoneUserClaims.LastName; person.Email = keystoneUserClaims.Email; person.Phone = keystoneUserClaims.PrimaryPhone?.ToPhoneNumberString(); person.LoginName = keystoneUserClaims.LoginName; // handle the organization if (keystoneUserClaims.OrganizationGuid.HasValue) { // first look by guid, then by name; if not available, create it on the fly since it is a person org var organization = (HttpRequestStorage.DatabaseEntities.Organizations.GetOrganizationByOrganizationGuid(keystoneUserClaims .OrganizationGuid.Value) ?? HttpRequestStorage.DatabaseEntities.Organizations.GetOrganizationByOrganizationName(keystoneUserClaims .OrganizationName)); if (organization == null) { var defaultOrganizationType = HttpRequestStorage.DatabaseEntities.OrganizationTypes.GetDefaultOrganizationType(); organization = new Organization(keystoneUserClaims.OrganizationName, true, defaultOrganizationType); HttpRequestStorage.DatabaseEntities.Organizations.Add(organization); sendNewOrganizationNotification = true; } organization.OrganizationName = keystoneUserClaims.OrganizationName; if (!organization.OrganizationGuid.HasValue) { organization.OrganizationGuid = keystoneUserClaims.OrganizationGuid; } person.Organization = organization; person.OrganizationID = organization.OrganizationID; } else { var unknownOrganization = HttpRequestStorage.DatabaseEntities.Organizations.GetUnknownOrganization(); person.OrganizationID = unknownOrganization.OrganizationID; //Assign user to magic Unkown Organization ID } person.UpdateDate = DateTime.Now; HttpRequestStorage.Person = person; HttpRequestStorage.DatabaseEntities.SaveChanges(person); if (sendNewUserNotification) { SendNewUserCreatedMessage(person, keystoneUserClaims.LoginName); } if (sendNewOrganizationNotification) { SendNewOrganizationCreatedMessage(person, keystoneUserClaims.LoginName); } return(HttpRequestStorage.Person); }
public void SetKeystoneUserClaims(IKeystoneUserClaims keystoneUserClaims) { // intentionally left blank }
public static IKeystoneUser SyncLocalAccountStore(IKeystoneUserClaims keystoneUserClaims, IIdentity userIdentity) { SitkaHttpApplication.Logger.DebugFormat("In SyncLocalAccountStore - User '{0}', Authenticated = '{1}'", userIdentity.Name, userIdentity.IsAuthenticated); var sendNewUserNotification = false; var sendNewOrganizationNotification = false; var person = HttpRequestStorage.DatabaseEntities.People.GetPersonByPersonGuid(keystoneUserClaims.UserGuid); // It can be useful to have the EXACT same time when looking for/at records later. var currentDateTime = DateTime.Now; if (person == null) { // new user - provision with limited role SitkaHttpApplication.Logger.DebugFormat( "In SyncLocalAccountStore - creating local profile for User '{0}'", keystoneUserClaims.UserGuid); var unknownOrganization = HttpRequestStorage.DatabaseEntities.Organizations.GetUnknownOrganization(); person = new Person(keystoneUserClaims.UserGuid, keystoneUserClaims.FirstName, keystoneUserClaims.LastName, keystoneUserClaims.Email, Role.Unassigned.RoleID, currentDateTime, true, unknownOrganization.OrganizationID, false, keystoneUserClaims.LoginName); person.TenantID = HttpRequestStorage.Tenant.TenantID; HttpRequestStorage.DatabaseEntities.AllPeople.Add(person); sendNewUserNotification = true; } else { // existing user - sync values SitkaHttpApplication.Logger.DebugFormat("In SyncLocalAccountStore - syncing local profile for User '{0}'", keystoneUserClaims.UserGuid); } person.FirstName = keystoneUserClaims.FirstName; person.LastName = keystoneUserClaims.LastName; person.Email = keystoneUserClaims.Email; person.Phone = keystoneUserClaims.PrimaryPhone?.ToPhoneNumberString(); person.LoginName = keystoneUserClaims.LoginName; Organization organization = null; // handle the organization if (keystoneUserClaims.OrganizationGuid.HasValue) { // We are having erratic errors here where we appear not to be able to look up Organizations in the database that definitely should be there. I'm // adding some additional debugging to track down the exact nature of the failure here, which I can't directly replicate. Sorry // for the noise here. -- SLG 1/21/2020 // first look by guid, then by name; var organizationByGuid = HttpRequestStorage.DatabaseEntities.Organizations.GetOrganizationByKeystoneOrganizationGuid(keystoneUserClaims.OrganizationGuid.Value); SitkaHttpApplication.Logger.Info($"Tenant \"{HttpRequestStorage.Tenant.TenantName}\" (TenantID: {HttpRequestStorage.Tenant.TenantID}): In SyncLocalAccountStore - organizationByGuid '{keystoneUserClaims.OrganizationGuid}' found: {organizationByGuid != null}"); var organizationByName = HttpRequestStorage.DatabaseEntities.Organizations.GetOrganizationByOrganizationName(keystoneUserClaims.OrganizationName); SitkaHttpApplication.Logger.Info($"Tenant \"{HttpRequestStorage.Tenant.TenantName}\" (TenantID: {HttpRequestStorage.Tenant.TenantID}): In SyncLocalAccountStore - organizationByName '{keystoneUserClaims.OrganizationName}' found: {organizationByName != null}"); organization = organizationByGuid ?? organizationByName; // If Organization not available, create it on the fly since it is a person org if (organization == null) { SitkaHttpApplication.Logger.Info($"Tenant \"{HttpRequestStorage.Tenant.TenantName}\" (TenantID: {HttpRequestStorage.Tenant.TenantID}): In SyncLocalAccountStore - Could not find Organization with keystoneUserClaims.OrganizationGuid '{keystoneUserClaims.OrganizationGuid}' or keystoneUserClaims.OrganizationName '{keystoneUserClaims.OrganizationName}'. Will attempt to create new Organization."); // Do we have any Organizations at all?? (Have we somehow trashed HttpRequestStorage.DatabaseEntities.Organizations?) SitkaHttpApplication.Logger.Info($"Tenant \"{HttpRequestStorage.Tenant.TenantName}\" HttpRequestStorage.DatabaseEntities.Organizations count: {HttpRequestStorage.DatabaseEntities.Organizations.Count()}"); var defaultOrganizationType = HttpRequestStorage.DatabaseEntities.OrganizationTypes.GetDefaultOrganizationType(); organization = new Organization(keystoneUserClaims.OrganizationName, true, defaultOrganizationType, Organization.UseOrganizationBoundaryForMatchmakerDefault, false); HttpRequestStorage.DatabaseEntities.AllOrganizations.Add(organization); sendNewOrganizationNotification = true; } else { SitkaHttpApplication.Logger.Info($"Tenant \"{HttpRequestStorage.Tenant.TenantName}\" (TenantID: {HttpRequestStorage.Tenant.TenantID}): In SyncLocalAccountStore - Successfully found existing Organization with keystoneUserClaims.OrganizationGuid '{keystoneUserClaims.OrganizationGuid}' or keystoneUserClaims.OrganizationName '{keystoneUserClaims.OrganizationName}'."); } organization.OrganizationName = keystoneUserClaims.OrganizationName; if (!organization.KeystoneOrganizationGuid.HasValue) { organization.KeystoneOrganizationGuid = keystoneUserClaims.OrganizationGuid; } person.Organization = organization; person.OrganizationID = organization.OrganizationID; } else { var unknownOrganization = HttpRequestStorage.DatabaseEntities.Organizations.GetUnknownOrganization(); person.OrganizationID = unknownOrganization.OrganizationID; //Assign user to magic Unknown Organization ID } MakeFirmaSessionForPersonLoggingIn(person, currentDateTime); if (sendNewUserNotification) { SendNewUserCreatedMessage(person, keystoneUserClaims.LoginName); } if (sendNewOrganizationNotification) { SendNewOrganizationCreatedMessage(person, keystoneUserClaims.LoginName); // Post new Organization to ProjectFirma if (person.Tenant.AreOrganizationsExternallySourced) { PostOrganizationToExternalSystem(organization).ContinueWith(t => Console.WriteLine(t.Exception), TaskContinuationOptions.OnlyOnFaulted); } } return(HttpRequestStorage.Person); }
public void SetKeystoneUserClaims(IKeystoneUserClaims keystoneUserClaims) { Organization = HttpRequestStorage.DatabaseEntities.Organizations.Where(x => x.OrganizationGuid.HasValue).SingleOrDefault(x => x.OrganizationGuid == keystoneUserClaims.OrganizationGuid); Phone = keystoneUserClaims.PrimaryPhone.ToPhoneNumberString(); Email = keystoneUserClaims.Email; }