我有一个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以某种方式执行登录以建立登录持续时间,如下所示:
因为似乎关闭了浏览器后,它仍然没有退出。不知道为什么令牌没有过期,也不确定我是否需要做其他事情来验证它/过期。
这个问题的第二个方面是,如果可能的话,我该如何注销所有浏览器标签/实例中的该会话。
在我的StartUp.cs中,我具有以下配置: var Authority = Configuration.GetSection(“ IdentityServer:Authority”)。Value;
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);
谢谢!