У меня есть экземпляр 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);
Спасибо!