Я выполняю задачу, которая разрешает учетной записи доступ только к одному мобильному приложению и браузеру на веб-сайте (при входе в другое мобильное приложение или браузер на веб-сайте это текущее мобильное приложение или веб-сайт браузера вернется на страницу входа при вызове 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;
}
Мой журнал: