Выйти из всех сессий IdentityServer4 - PullRequest
0 голосов
/ 14 марта 2019

У меня есть экземпляр IdentityServer4, который управляет аутентификацией, и я обнаружил, что моя маленькая реализация, кажется, неправильно обрабатывает пару вещей:

1) «Автоматический выход из системы» после Xколичество минут без взаимодействия, то новое действие с атрибутом Authorized вернет 401 назад.

2) Несколько сеансов браузера (я просто дублирую вкладки здесь) кажутся независимыми от каждогос другой стороны, когда я выхожу из одного экрана, я все еще могу делать что-то на другой вкладке, однако я ожидал, что мой API отклонит любой запрос, так как пользователь все-таки вышел из системы.

Из-за того, что я используюMongoDB в качестве своего уровня персистентности я решил интегрировать пакет https://github.com/alexandre-spieser/AspNetCore.Identity.MongoDbCore.Мой AccountController выглядит следующим образом:

/// <summary>
/// Show login page
/// </summary>
[HttpGet]
public IActionResult Login(string returnUrl)
{
    var viewModel = new LoginInputModel
    {
        ReturnUrl = returnUrl
    };

    return View(viewModel);
}

/// <summary>
/// Handle postback from username/password login
/// </summary>
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginInputModel model)
{
    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberLogin, false);

        if (result.Succeeded)
        {
            if (Url.IsLocalUrl(model.ReturnUrl))
            {
                return Redirect(model.ReturnUrl);
            }

            return Redirect("~/");
        }

        ModelState.AddModelError(string.Empty, AccountOptions.InvalidCredentialsErrorMessage);
    }

    // something went wrong, show form with error
    return View(model);
}

/// <summary>
/// Show logout page
/// </summary>
[HttpGet]
public async Task<IActionResult> Logout(string logoutId)
{
    var logoutContext = await _interaction.GetLogoutContextAsync(logoutId);

    await _signInManager.SignOutAsync();

    return Redirect(logoutContext.PostLogoutRedirectUri);
}

Мой вопрос заключается в том, как заставить SignInManager каким-либо образом выполнить вход в установлении продолжительности входа в систему, например:

https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/blob/master/Quickstart/Account/AccountController.cs#L125

потому что кажется, что это не выходит даже после закрытия браузера.Не знаю, почему токен не просрочен и нужно ли что-то еще проверять, чтобы его проверить /expire.

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

В моем файле StartUp.cs имеется следующая конфигурация: var author = Configuration.GetSection ("IdentityServer: Authority"). Значение;

        Logger.Info($"Using authority {authority} for authentication...");

        var identityDatabaseName = Configuration.GetSection("IdentityServer:DatabaseName").Value;

        Logger.Info($"Using {identityDatabaseName} MongoDB database for identity server data...");

        services.AddIdentity<ApplicationUser, MongoIdentityRole>()
                .AddMongoDbStores<ApplicationUser, MongoIdentityRole, Guid>(connectionString, identityDatabaseName)
                .AddDefaultTokenProviders();

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {
            options.Authority = authority;
            options.Audience = "myapi";
            options.RequireHttpsMetadata = false;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

Спасибо!

...