Exemple #1
0
        public async Task <IActionResult> StoreData([FromBody] StoreSessionDataRequest request)
        {
            if (request == null)
            {
                return(new NotFoundResult());
            }
            if (string.IsNullOrEmpty(request.Key))
            {
                return(new NotFoundResult());
            }
            if (!string.IsNullOrEmpty(request.Data) && request.Data.Length > 4096)
            {
                return(new NotFoundResult());
            }
            var spa = _externalSpaStore.GetRecord(request.Key);

            if (spa == null)
            {
                return(new NotFoundResult());
            }
            var key = $".extSpa.Session.{request.Key}";

            SessionCacheManager <string>
            .Insert(_httpContextAccessor.HttpContext, key, request.Data);

            return(new OkResult());
        }
Exemple #2
0
 public async Task UpdateEventEndDate(Guid eventId, DateTime endTime)
 {
     var datetimeUtcIso8601   = endTime.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss.fffzzz", CultureInfo.InvariantCulture);
     var extendEventStatement = "UPDATE EventData SET endtime = '" + datetimeUtcIso8601 + "' WHERE EventID=" + eventId + ";";
     var session = SessionCacheManager.GetSession(KeySpace);
     await session.ExecuteAsync((await session.PrepareAsync(extendEventStatement)).Bind());
 }
Exemple #3
0
        private async Task <IEnumerable <Guid> > GetEventParticipantsList(Guid eventId)
        {
            var session           = SessionCacheManager.GetSession(KeySpace);
            var query             = "SELECT UserId FROM EventParticipantMapping WHERE EventId=" + eventId.ToString() + "ALLOW FILTERING;";
            var preparedStatement = await session.PrepareAsync(query);

            var resultSet = await session.ExecuteAsync(preparedStatement.Bind());

            return(resultSet.Select(row => row.GetValue <Guid>("userid")));
        }
Exemple #4
0
        public async Task <DataContract.Event> GetEvent(Guid eventId)
        {
            var query             = "SELECT EventDetails from EventData WHERE EventId=" + eventId.ToString() + ";";
            var sessionL          = SessionCacheManager.GetSession(KeySpace);
            var preparedStatement = await sessionL.PrepareAsync(query);

            var resultSet = await sessionL.ExecuteAsync(preparedStatement.Bind());

            return(JsonConvert.DeserializeObject <DataContract.Event>(resultSet.First().GetValue <string>("eventdetails")));
        }
        private async Task <IEnumerable <Guid> > GetEventIdsByUserId(Guid userid)
        {
            var sessionL          = SessionCacheManager.GetSession(KeySpace);
            var query             = "SELECT EventId FROM EventParticipantMapping WHERE UserId=" + userid.ToString() + ";";
            var preparedStatement = await sessionL.PrepareAsync(query);

            var resultSet = await sessionL.ExecuteAsync(preparedStatement.Bind());

            return(resultSet.Select(row => row.GetValue <Guid>("eventid")));
        }
Exemple #6
0
        public async Task SaveEvent(Evento @event)
        {
            if (@event == null)
            {
                throw new ArgumentNullException(nameof(@event));
            }

            var updateParticipantStateStatement = "UPDATE EventData SET EventDetails = '" + JsonConvert.SerializeObject(@event) + "' WHERE EventID=" + @event.Id + ";";
            var session = SessionCacheManager.GetSession(KeySpace);
            await session.ExecuteAsync((await session.PrepareAsync(updateParticipantStateStatement)).Bind());
        }
Exemple #7
0
        private async Task InsertAsyncEventData(Evento @event)
        {
            var session         = SessionCacheManager.GetSession(KeySpace);
            var eventJson       = JsonConvert.SerializeObject(@event);
            var insertEventData =
                $"INSERT INTO EventData (EventId, StartTime, EndTime, EventDetails) values ({@event.Id},'{@event.StartTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)}','{@event.EndTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)}','{eventJson}');";
            var ips = await session.PrepareAsync(insertEventData);

            var statement = ips.Bind();
            await session.ExecuteAsync(statement);
        }
        private async Task InsertEventParticipantMapping(Guid eventId, IEnumerable <Guid> participantIds)
        {
            var session = SessionCacheManager.GetSession(KeySpace);

            participantIds?.ToList().ForEach(async participantId =>
            {
                var insertEventParticipantMapping = $"INSERT INTO UserEvent (UserId ,EventId) values ({participantId},{eventId});";
                var ips       = await session.PrepareAsync(insertEventParticipantMapping);
                var statement = ips.Bind();
                await session.ExecuteAsync(statement);
            });
        }
        private async Task <IEnumerable <DataContract.Event> > GetEventsByEventIds(IEnumerable <Guid> eventIds)
        {
            var datetimeUtcIso8601 = DateTime.UtcNow.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss.fffzzz", CultureInfo.InvariantCulture);
            var query = "SELECT EventDetails FROM EventData WHERE EventId IN (" + string.Join(",", eventIds.ToList()) + ") " +
                        "and EndTime > '" + datetimeUtcIso8601 + "' ALLOW FILTERING;";
            var sessionL          = SessionCacheManager.GetSession(KeySpace);
            var preparedStatement = await sessionL.PrepareAsync(query);

            var resultSet = await sessionL.ExecuteAsync(preparedStatement.Bind());

            return(resultSet.Select(row => JsonConvert.DeserializeObject <DataContract.Event>(row.GetValue <string>("eventdetails"))));
        }
        private async Task DeleteEventParticipantMapping(Guid eventId, IEnumerable <Guid> participantIds)
        {
            var session = SessionCacheManager.GetSession(KeySpace);

            participantIds?.ToList().ForEach(async participant =>
            {
                var deleteEventParticipantMappings = $"Delete from UserEvent where UserId ={participant} AND EventId={eventId};";
                var ips       = await session.PrepareAsync(deleteEventParticipantMappings);
                var statement = ips.Bind();
                await session.ExecuteAsync(statement);
            });
        }
Exemple #11
0
        public async Task DeleteEventParticipantMapping(Guid eventId)
        {
            var participantList = (await GetEventParticipantsList(eventId)).ToList();
            var session         = SessionCacheManager.GetSession(KeySpace);

            participantList.ForEach(async participant =>
            {
                var deleteEventParticipantMappings = "Delete from EventParticipantMapping where UserId = " + participant + " AND EventId=" + eventId + ";";
                var ips       = await session.PrepareAsync(deleteEventParticipantMappings);
                var statement = ips.Bind(participant, eventId);
                await session.ExecuteAsync(statement);
            });
        }
        public async Task UpdateEvent(Evento @event, bool updateParticipants = false)
        {
            if (@event == null)
            {
                throw new ArgumentNullException(nameof(@event));
            }

            if (updateParticipants)
            {
                await UpdateParticipants(@event);
            }

            var updateParticipantStateStatement = $"UPDATE EventData SET StartTime = '{@event.StartTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)}',EndTime='{@event.EndTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)}', EventDetails = '" + JsonConvert.SerializeObject(@event) + "' WHERE EventID=" + @event.Id + ";";
            var session = SessionCacheManager.GetSession(KeySpace);
            await session.ExecuteAsync((await session.PrepareAsync(updateParticipantStateStatement)).Bind());
        }
Exemple #13
0
        public async Task <IActionResult> FetchData(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return(new NotFoundResult());
            }
            var key = $".extSpa.Session.{id}";

            if (Session.IsAvailable)
            {
                var data = SessionCacheManager <string>
                           .Grab(_httpContextAccessor.HttpContext, key);

                return(new JsonResult(data));
            }
            return(new JsonResult(null));
        }
Exemple #14
0
        private async Task InsertEventParticipantMapping(Evento @event)
        {
            var         session         = SessionCacheManager.GetSession(KeySpace);
            List <Guid> participantList = (await GetEventParticipantsList(@event.Id)).ToList();

            participantList.ForEach(async participant =>
            {
                var insertEventParticipantMapping = "INSERT INTO EventParticipantMapping " +
                                                    "(UserId ,EventId)" +
                                                    "values " +
                                                    "(" + participant + "," + @event.Id + ");";
                var ips       = await session.PrepareAsync(insertEventParticipantMapping);
                var eventJson = JsonConvert.SerializeObject(@event);
                var statement = ips.Bind();
                await session.ExecuteAsync(statement);
            });
        }
        public async Task <IActionResult> Logout()
        {
            var loadedSpas = SessionCacheManager <Dictionary <string, ExternalSPARecord> >
                             .Grab(_httpContextAccessor.HttpContext, ".loadedSpas") ?? new Dictionary <string, ExternalSPARecord>();

            var query = from item in loadedSpas
                        let c = new FrontChannelRecord {
                LogoutUri = item.Value.LogoutUri
            }
            select c;
            var    frontChannelRecords = query.ToList();

            ViewBag.logoutRecords = frontChannelRecords;

            await _signInManager.SignOutAsync();

            _logger.LogInformation("User logged out.");
            var url = Url.Action(nameof(HomeController.Index), "Home");

            ViewBag.RedirectUrl = url;
            return(View());

            return(RedirectToAction(nameof(HomeController.Index), "Home"));
        }
 public ApiSessionAuthorizeAttribute() : base(_policy_)
 {
     _cache = SessionCacheManager.Instance();
 }
Exemple #17
0
 public async Task DeleteAsyncEventData(Guid eventId)
 {
     var session = SessionCacheManager.GetSession(KeySpace);
     var eventDeleteStatement = "Delete from EventData where EventId=" + eventId + ";";
     await session.ExecuteAsync((await session.PrepareAsync(eventDeleteStatement)).Bind(eventId));
 }
Exemple #18
0
        static void Main(string[] args)
        {
            bool is_raw     = false;
            bool is_silent  = false;
            int  thread_cnt = DEFAULT_THREAD_CNT;
            int  iter_cnt   = DEFAULT_ITERATION_CNT;

            for (int inx = 0; inx < args.Length; inx++)
            {
                if ("-RAW".Equals(args[inx], StringComparison.InvariantCultureIgnoreCase))
                {
                    is_raw = true;
                }
                if ("-SILENT".Equals(args[inx], StringComparison.InvariantCultureIgnoreCase))
                {
                    is_silent = true;
                }
                else if ("-ITERATIONS".Equals(args[inx], StringComparison.InvariantCultureIgnoreCase))
                {
                    iter_cnt = int.Parse(args[inx + 1]);
                }
                else if ("-THREADS".Equals(args[inx], StringComparison.InvariantCultureIgnoreCase))
                {
                    thread_cnt = int.Parse(args[inx + 1]);
                }
            }
            if (!is_silent)
            {
                Console.WriteLine("Authorization List Checker Test");
                Console.WriteLine("AuthListTest [-RAW] [-SILENT] [-ITERATIONS <#>] [-THREADS <#>]");
                Console.WriteLine("DB initialization");
            }
            DbManager.InitializeDB(thread_cnt);
            if (!is_silent)
            {
                Console.WriteLine("Done");
            }

            User[] users   = DbManager.GetUsers(thread_cnt);
            var    started = DateTime.Now;

            ThreadPool.SetMaxThreads(thread_cnt, thread_cnt);
            ThreadPool.SetMinThreads(thread_cnt, thread_cnt);
            for (int i = 0; i < thread_cnt; i++)
            {
                var test = new AuthorizationCheckerTest()
                {
                    IsSilent       = is_silent,
                    ThreadIndex    = i,
                    UserId         = users[i].Id,
                    IterationCount = iter_cnt,
                    SessionMgr     = (is_raw ?
                                      (ISessionManager) new SessionManager() : new SessionCacheManager())
                };

                ThreadPool.QueueUserWorkItem(new WaitCallback(TestThreadProc), test);
            }
            while (Interlocked.Read(ref FinishedThreadsCount) < thread_cnt)
            {
                Thread.Sleep(0);
            }
            var total = (int)DateTime.Now.Subtract(started).TotalMilliseconds;

            if (is_silent)
            {
                Console.WriteLine(total);
            }
            else
            {
                Console.WriteLine("TOTAL(" +
                                  (is_raw ? "RAW" : "CACHE") + ", ITERATIONS:" + iter_cnt + ", THREADS:" + thread_cnt + ") = "
                                  + total + "ms");
            }
            SessionCacheManager.TerminateCaching();
        }
        public async Task <IActionResult> OnGetCallbackAsync(string returnUrl = null, string prompt = null, string remoteError = null)
        {
            string currentNameIdClaimValue = null;

            if (User.Identity.IsAuthenticated)
            {
                // we will only create a new user if the user here is actually new.
                var qName = from claim in User.Claims
                            where claim.Type == ".nameIdentifier"
                            select claim;
                var nc = qName.FirstOrDefault();
                currentNameIdClaimValue = nc?.Value;
            }
            var oidc = await HarvestOidcDataAsync();

            var session = _httpContextAccessor.HttpContext.Session;

            if (remoteError != null)
            {
                ErrorMessage = $"Error from external provider: {remoteError}";
                return(RedirectToPage("./Login"));
            }
            var info = await _signInManager.GetExternalLoginInfoAsync();

            if (info == null)
            {
                return(RedirectToPage("./Login"));
            }

            // Sign in the user with this external login provider if the user already has a login.

            /*
             * var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor : true);
             * if (result.Succeeded)
             * {
             *     _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);
             *     return LocalRedirect(Url.GetLocalUrl(returnUrl));
             * }
             */
            var query = from claim in info.Principal.Claims
                        where claim.Type == "DisplayName"
                        select claim;
            var queryNameId = from claim in info.Principal.Claims
                              where claim.Type == ClaimTypes.NameIdentifier
                              select claim;
            var nameClaim   = query.FirstOrDefault();
            var displayName = nameClaim.Value;
            var nameIdClaim = queryNameId.FirstOrDefault();

            if (!string.IsNullOrEmpty(currentNameIdClaimValue) &&
                (currentNameIdClaimValue != nameIdClaim.Value))
            {
                session.Clear();
            }
            if (currentNameIdClaimValue == nameIdClaim.Value)
            {
                session.SetObject(".identity.oidc", oidc);
                session.SetObject(".identity.strongLoginUtc", DateTimeOffset.UtcNow);
                // this is a re login from the same user, so don't do anything;
                return(LocalRedirect(Url.GetLocalUrl(returnUrl)));
            }
            // paranoid
            var leftoverUser = await _userManager.FindByEmailAsync(displayName);

            if (leftoverUser != null)
            {
                await _userManager.DeleteAsync(leftoverUser); // just using this inMemory userstore as a scratch holding pad
            }
            var user = new ApplicationUser {
                UserName = nameIdClaim.Value, Email = displayName
            };

            // SHA256 is disposable by inheritance.
            using (var sha256 = SHA256.Create())
            {
                // Send a sample text to hash.
                var hashedBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(nameIdClaim.Value));
                // Get the hashed string.
                var hash = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
                SessionCacheManager <string> .Insert(_httpContextAccessor.HttpContext, ".identity.userHash", hash);
            }
            var result = await _userManager.CreateAsync(user);

            var newUser = await _userManager.FindByIdAsync(user.Id);

            var cQuery = from claim in _settings.Value.PostLoginClaims
                         let c = new Claim(claim.Name, claim.Value)
                                 select c;
            var eClaims = cQuery.ToList();

            eClaims.Add(new Claim("custom-name", displayName));
            eClaims.Add(new Claim(".nameIdentifier", nameIdClaim.Value));// normalized id.
            await _userManager.AddClaimsAsync(newUser, eClaims);

            if (result.Succeeded)
            {
                await _signInManager.SignInAsync(user, isPersistent : false);

                await _userManager.DeleteAsync(user); // just using this inMemory userstore as a scratch holding pad

                _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
                session.SetObject(".identity.oidc", oidc);
                session.SetObject(".identity.strongLoginUtc", DateTimeOffset.UtcNow);
                //      _httpContextAccessor.HttpContext.DropBlueGreenApplicationCookie(_deploymentOptions);

                return(LocalRedirect(Url.GetLocalUrl(returnUrl)));
            }

            return(RedirectToPage("./Login"));
        }
        public async Task <IActionResult> Index(string id)
        {
            Logger.LogInformation("Hello from the External SPA Home Index Controller");
            var spa = _externalSpaStore.GetRecord(id);

            if (spa == null)
            {
                return(new NotFoundResult());
            }

            var loadedSpas = SessionCacheManager <Dictionary <string, ExternalSPARecord> > .Grab(_httpContextAccessor.HttpContext,
                                                                                                 _loadedSpasKey) ?? new Dictionary <string, ExternalSPARecord>();


            var result = HttpContext.User.Claims.Select(
                c => new ClaimType {
                Type = c.Type, Value = c.Value
            });

            var cacheKey = $".extSpaViewBagRecord.{id}";

            ViewBagRecord viewBagRecord = null;
            var           value         = await _cache.GetAsync(cacheKey);

            if (value != null)
            {
                viewBagRecord = ZeroFormatterSerializer.Deserialize <ViewBagRecord>(value);
            }
            else
            {
                var doc = await _discoveryCache.GetAsync();

                var request = new AuthorizeRequest(doc.AuthorizeEndpoint);
                var url     = request.CreateAuthorizeUrl(
                    clientId: spa.ClientId,
                    responseType: OidcConstants.ResponseTypes.Code,
                    prompt: OidcConstants.PromptModes.None,
                    redirectUri: spa.RedirectUri,
                    scope: "openid profile email");
                var mySpaRecord = new MySpaRecord()
                {
                    ClientId      = spa.ClientId,
                    Key           = spa.Key,
                    RedirectUri   = spa.RedirectUri,
                    CacheBustHash = spa.CacheBustHash
                };
                viewBagRecord = new ViewBagRecord {
                    AuthorizeEndpoint = doc.AuthorizeEndpoint,
                    AuthorizeUrl      = url, SpaRecord = mySpaRecord
                };
                var val = ZeroFormatterSerializer.Serialize(viewBagRecord);
                var cacheEntryOptions = new DistributedCacheEntryOptions()
                                        .SetSlidingExpiration(TimeSpan.FromMinutes(5));
                _cache.Set(cacheKey, val, cacheEntryOptions);
            }

            ViewBag.ViewBagRecord = viewBagRecord;
            if (!loadedSpas.ContainsKey(id))
            {
                loadedSpas.Add(id, spa);
                SessionCacheManager <Dictionary <string, ExternalSPARecord> >
                .Insert(_httpContextAccessor.HttpContext, _loadedSpasKey, loadedSpas);
            }
            var key        = $".extSpa.Session.{viewBagRecord.SpaRecord.Key}";
            var customData = SessionCacheManager <string>
                             .Grab(_httpContextAccessor.HttpContext, key);

            ViewBag.CacheBustHash = viewBagRecord.SpaRecord.CacheBustHash;
            ViewBag.CustomData    = customData;
            return(View(spa.View, result));
        }