gpt4 book ai didi

asp.net-core - ASP.NET 5 Identity 3 用户在一段时间后退出

转载 作者:行者123 更新时间:2023-12-04 05:23:02 27 4
gpt4 key购买 nike

我使用 RC1 位和外部(Google)身份验证,没有 Identity.EntityFramework。

在登录期间,我设置了“记住我”标志。

登录用户在浏览器重新启动后幸存下来(我看到 cookie 设置为在 14 天后过期)和网站重新启动。

但是在一段时间不活动(大约 15 分钟)之后,无论浏览器/站点是否重​​新启动,刷新页面都会导致退出,日志显示:

info: Microsoft.AspNet.Authentication.Cookies.CookieAuthenticationMiddleware:
AuthenticationScheme: Microsoft.AspNet.Identity.Application signed out.
AuthenticationScheme: Microsoft.AspNet.Identity.External signed out.
AuthenticationScheme: Microsoft.AspNet.Identity.TwoFactorUserId signed out.

这看起来像以前的 ASP 中的“ session ”,但我在这里没有使用任何 session 。

这是我的本地开发机器,没有 IIS,直接 Kestrel 连接到 5000 端口,所以这不是 data-protection problem

为什么用户强制退出?

更新 : 我的 Startup.cs文件:
public void ConfigureServices(IServiceCollection services) 
{
....
var identityBuilder = services
.AddIdentity<User, UserRole>(options =>
{
options.User.AllowedUserNameCharacters = null;
options.Cookies.ApplicationCookie.LoginPath = "/user/login";
options.Cookies.ApplicationCookie.LogoutPath = "/user/logout";
});
identityBuilder.Services
.AddScoped<IUserStore<User>, SportCmsDb>(serviceProvider => serviceProvider.GetService<SportCmsDb>())
.AddScoped<IRoleStore<UserRole>, SportCmsDb>(serviceProvider => serviceProvider.GetService<SportCmsDb>());
identityBuilder
.AddDefaultTokenProviders();
....

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
....
app.UseIdentity();
app.UseGoogleAuthentication(options =>
{
options.ClientId = Configuration["OAuth:Google:ClientId"];
options.ClientSecret = Configuration["OAuth:Google:Secret"];
});
....
SportCmsDbDbContext并且还实现了 IUserStore<User> , IUserLoginStore<User> , IUserEmailStore<User> , IRoleStore<UserRole> , IUserClaimStore<User>
更新 2

我启用了详细(调试)日志记录,发现当用户退出时 - 在此之前我的 IUserStore<User>.FindByIdAsync叫做。具有真实/现有的用户 ID,并且函数返回正确的非空用户。一切似乎都很好。但是我从数据库加载 User被“拒绝”并被迫退出。没有其他日志消息可以揭示原因/位置。

最佳答案

哇,我解决了!

TL;DR

我需要执行IUserSecurityStampStore<User>在我的自定义 UserManager (又名 SportCmsDb)。

详情

AddIdentity期间调用(在 Startup.cs ConfigureServices 方法中) IdentityOptions are configureddefault instance of IdentityCookieOptions .在 IdentityCookieOptions 的构造函数中ApplicationCookie 的实例(类型为 CookieAuthenticationOptions )使用处理程序 CookieAuthenticationEvents.OnValidatePrincipal 创建set to SecurityStampValidator.ValidatePrincipalAsync 静态方法。

UseIdentity期间调用(在 Startup.cs Configure 方法中)CookieAuthenticationMiddlewareconfigured with IdentityOptions.Cookies.ApplicationCookie options .
CookieAuthenticationHandler (由 CookieAuthenticationMiddleware 创建)在它的 HandleAuthenticateAsync方法从 cookie 中读取票证并调用 Options.Events.ValidatePrincipal验证处理程序。

实际上,SecurityStampValidator.ValidatePrincipalAsync叫做。此方法检查 enough time has elapsed由于 cookie 已发出 (30 min by default) 并调用 ISecurityStampValidator.validateAsync (第 81-82 行)。
ISecurityStampValidator 的默认实现是 SecurityStampValidator<TUser> .它调用 SignInManager<TUser>.ValidateSecurityStampAsync 返回 - 拒绝委托(delegate)人并强制用户退出(第 30-40 行)。
SignInManager<TUser>在其ValidateSecurityStampAsync method尝试从 User 读取安全标记如果不能(如果 UserManager<User> 不支持此接口(interface))或标记与保存的不匹配(在 cookie 中),则返回 null。

我的定制UserManager未实现 IUserSecurityStampStore<User> .答对了。

关于asp.net-core - ASP.NET 5 Identity 3 用户在一段时间后退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37162791/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com