Проверка подлинности Asp.Net Core 2 MVC: добавление разного времени сеанса - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в кодировании в целом и, в частности, в ядре Asp.Net, так что извините меня за это.Я действительно надеюсь на некоторую помощь с моим проектом.Я сейчас рву волосы, добавляя разные TimeSpan для разных пользователей при входе в систему. Скажем, для примера пользователя из company 1 войдите в систему и, надеюсь, получите время сеанса, скажем, 60 минут (времени простоя, но когда пользователь из компания 2 войдет в систему, время сеанса может быть, по умолчанию, 20 мин.

ОБНОВЛЕНИЕ : Моя Цельframework - это .Net Framework 4.6.1 , но код подготовлен для .Net Core 2.1 , и я запускаю пакет Identity v2.1.2

Мой класс startup выглядит следующим образом:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        CultureInfo.CurrentCulture = new CultureInfo("sv-SE");
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

        if (env.IsDevelopment())
        {
            builder.AddUserSecrets<Startup>();
        }

        builder.AddInMemoryCollection(GetBeanstalkEnvironmentProperties());
        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IConfiguration>(Configuration);

        // Add framework services.
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("ExternalServerConnection")));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.Configure<EmailConfiguration>(Configuration.GetSection("EmailConfiguration"));
        services.AddMvc();

        // Add application services.
        services.AddTransient<IEmailSender, AuthMessageSender>();
        services.AddTransient<ISmsSender, AuthMessageSender>();
    }

Вход в контроллер так же просто, как этот:

  public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        if (ModelState.IsValid)
        {
            var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
            if (result.Succeeded)
            {
                _logger.LogInformation(1, "User logged in.");

                return RedirectToAction("...");
            ...

И после проверки различных решений и форумовнайденная эта опция для добавления Timespan в Startup:

        services.Configure<SecurityStampValidatorOptions>(options =>
        {
            // Add validationinterval E.g how often the stamp is checked.
            options.ValidationInterval = TimeSpan.FromSeconds(10);
        });
        services.AddAuthentication().Services.ConfigureApplicationCookie(options =>
        {
            // Timespan extension if page is refreshed or navigated. Default is true.
            options.SlidingExpiration = true;
            // Cookie is valid at minimum 20 min.
            options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
        });

Это прекрасно работает, но это глобальный способ установки времени сеанса для пользователей и затемприменяются ко всем пользователям.Поэтому я надеюсь, что у кого-то есть хорошее решение, в котором я смогу использовать вышеизложенное и при этом иметь возможность добавлять различные значения здесь options.ExpireTimeSpan = TimeSpan.FromMinutes(20); в зависимости от предпочтений пользователя, например, к какой компании принадлежит пользователь.

Другие ссылки и что я пробовал до сих пор.

Я пытался выяснить этот один из них, но мне не удалосьдело.Я думаю, мне нужно было бы сначала иметь возможность проверить пользователя на наличие претензий (чтобы увидеть, к какой компании принадлежит пользователь) и, возможно, установить значение для конкретной компании, например company 1 value 60 в Затем в таблице БД затем прочитайте это значение и обновите Timespan этим значением из БД или более «безобразно», просто жестко закодировав значение в Startup.Скажем, что пользователь принадлежит определенной компании, которая затем должна иметь определенное значение сеанса или, если не установлено значение по умолчанию, равное 20 мин.Например, в псевдо: (Если user.companyID равен 1, тогда установите options.ExpireTimeSpan = TimeSpan.FromMinutes (60)) и так далее.Моя проблема здесь в том, что, конечно, я не могу получить доступ к этим значениям при запуске, и, вероятно, не должен?

Я также пытался это , но это расширяет куки для клиентской стороны, если я не ошибаюсь и не влияю на время простоя пользователя ?!и он также использует сессию, которую, я думаю, я мог бы добавить, но я не уверен, что это все равно будет хорошо в моей ситуации.

Я старался как можно точнее следовать этой документации.Но фреймворк, похоже, не поддерживает множественные / разные настройки ExpireTimeSpan.

Здесь - еще один вопрос, на который еще нет ответов, с чем я могу сказать ту же проблему, что и у меня.

1 Ответ

0 голосов
/ 28 февраля 2019

Я решил это следующим образом:

    services.Configure<SecurityStampValidatorOptions>(Configuration.GetSection("SecurityStampValidatorOptions"));

    services.AddAuthentication().Services.ConfigureApplicationCookie(options =>
            {
                var cookieAuthenticationOptions = Configuration
                   .GetSection(nameof(CookieAuthenticationOptions))
                   .Get<CookieAuthenticationOptions>();
                if (cookieAuthenticationOptions == null)
                    return;

                options.ExpireTimeSpan = cookieAuthenticationOptions.ExpireTimeSpan;
                options.SlidingExpiration = cookieAuthenticationOptions.SlidingExpiration;
            });

Возможно, это не самый лучший способ, но тогда я все еще могу использовать опции Services.ConfigureApplicationCookie и иметь возможность переопределить SecurityStampValidatorOptions и часть CookieAuthenticationOptions из настроек(appsettings.json, ENV и т. д.) и тем самым я могу развернуть приложение с другими настройками.

Я не смог выяснить, как настроить cookie-файл приложения непосредственно из раздела конфигурации, чтобы задать несколько выбранных атрибутовесли настройки доступны.

Так что мой реальный вопрос не решил, но это достаточно хорошо, потому что у меня есть разные варианты развертывания и места, так что это рабочий обход.

Затем я могу для exempel сделать это в appsettings.json:

"SecurityStampValidatorOptions": {
  "ValidationInterval": "0.00:00:20"
    },
"CookieAuthenticationOptions": {
   "SlidingExpiration": true,
   "ExpireTimeSpan": "0.02:00:00"
  }

и переопределить значения по умолчанию, а также заранее указать, что в Startup.

нет жестко закодированных значений.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...