Разрешить учетной записи доступ только к одному мобильному приложению и браузеру на сайте - PullRequest
0 голосов
/ 17 марта 2020

Я выполняю задачу, которая разрешает учетной записи доступ только к одному мобильному приложению и браузеру на веб-сайте (при входе в другое мобильное приложение или браузер на веб-сайте это текущее мобильное приложение или веб-сайт браузера вернется на страницу входа при вызове APi ). Моя идея - создать словарь> в классе AddSingleton, чтобы сохранить userName и Token. Запрос запроса к API проверит, существует ли эта учетная запись и токен в словаре> или нет. Все работает на локальном (dev), но когда я развертываю на сервере, Dictionary> очистить (удалить) все значения, сохраненные ранее автоматически. Кто-нибудь знает почему или есть идеи по этому вопросу. Спасибо всем.

Объявление при запуске:

services.AddSingleton<DictionaryAccount, DictionaryAccount>();

Событие при вызове API при запуске:

OnTokenValidated = AdditionalValidation

Fuction AdditionalValidation при запуске:

public Task AdditionalValidation(TokenValidatedContext context)
        {
            bool check = true;

            var securityToken = context.SecurityToken as JwtSecurityToken;
            var claim = securityToken.Claims.SingleOrDefault(t => t.Type == "unique_name");
            //1 - web ; 2 - mobile
            var platform = securityToken.Claims.SingleOrDefault(t => t.Type == "platform");
            try
            {
                if (TurnOff != 1)
                {
                    if (platform.Value != null)
                    {
                        try
                        {
                            int type = int.Parse(platform.Value);
                            string email = securityToken.Claims.SingleOrDefault(t => t.Type == "Email").Value;
                            if(!string.IsNullOrEmpty(email) && !string.IsNullOrEmpty(securityToken.RawData))
                            {
                                using (var serviceScope = _app.ApplicationServices.CreateScope())
                                {

                                    var _context = serviceScope.ServiceProvider.GetRequiredService<DictionaryAccount>();
                                    check = _context.CheckValidSession(type, email, securityToken.RawData, _logger);
                                }
                            }                                                    
                        }
                        catch (Exception e)
                        {
                            _logger.LogError("Fail login startUp " + e.ToString());
                            context.Response.StatusCode = (int)HttpStatusCode.RequestedRangeNotSatisfiable;
                            context.Fail("Failed additional validation");
                        }
                    }
                    if (!check)
                    {
                        context.Response.StatusCode = (int)HttpStatusCode.RequestedRangeNotSatisfiable;
                        context.Fail("Failed additional validation");
                    }
                }
            }
            catch(Exception e) 
            {
                _logger.LogError("Fail login startUp " + e.ToString());
                context.Response.StatusCode = (int)HttpStatusCode.RequestedRangeNotSatisfiable;
                context.Fail("Failed additional validation");
            }

            return Task.CompletedTask;
        }

Функция CheckValidSession:

public bool CheckValidSession(int type, string email, string token, ILogger<AuthController> _logger)
        {
            string outConnection;
            try
            {
                //1 - web ; 2 - mobile
                _logger.LogWarning("login write log email: " +email);
                _logger.LogWarning("login write log type: " +type);
                _logger.LogWarning("login write log token: " + token);
                _logger.LogWarning("login write log list" + string.Join(",", accountListWebsite.Select(x => x.Key).ToArray()));

                var item = accountListWebsite.Select(x => x.Value).ToList();
                for (int i = 0; i < item.Count; i++)
                {
                    _logger.LogWarning("Token In list: " + string.Join(",", accountListWebsite.Select(x => x.Value).ToList()[0].ToArray()));
                }


                if (type == 1)
                {
                    if (accountListWebsite[email].TryGetValue(token, out outConnection))
                    {
                        _logger.LogWarning("return true");
                        return true;
                    }
                } 
                else if(type == 2)
                {
                    if (accountListMobile[email].TryGetValue(token, out outConnection))
                    {
                        return true;
                    }
                }

                return false;
            }
            catch(Exception e)
            {
                _logger.LogWarning("Exception return false " + e.ToString(), e.Message);
                bool check = false;
                return check;
            }
        }

Функция CreateDictionaryAccountWeb: -> вызывала эту функцию при успешном входе в систему

public bool CreateDictionaryAccountWeb(string email, string token, int count, ILogger<AuthController> logger)
        {
            _logger = logger;
            Count = count;
            bool result = true;
            try
            {
                lock (accountListWebsite)
                {
                    HashSet<string> emails;
                    if (!accountListWebsite.TryGetValue(email, out emails))
                    {
                        emails = new HashSet<string>();
                        accountListWebsite.Add(email, emails);
                    }
                    _logger.LogWarning("login write log " + string.Join(",", accountListWebsite.Select(x => x.Key).ToArray()));
                    lock (accountListWebsite)
                    {
                        if (emails != null && emails.Count >= 0) {
                            if (!emails.Any(x => x.Contains(token))) {
                                if (emails.Count >= count)
                                {
                                    var temp = emails.First();
                                    if (temp != token)
                                        emails.Remove(temp);
                                }

                                _logger.LogWarning("login token " + token);
                                emails.Add(token);
                            }
                        }
                        else
                        {
                            emails.Add(token);
                        }

                    }
                }
            }
            catch (Exception e)
            {
                _logger.LogError("Fail login" + e.ToString());
                result = false;
            }

            return result;
        }

Мой журнал:

...