【发布时间】:2017-11-01 06:00:06
【问题描述】:
好的,我已经为此苦苦挣扎了 2 天,但找不到任何相关信息。
我正在使用 asp.net core 1.1,并且我已经在我的系统中实现了身份,并且效果很好。但我的问题是用户在更新安全标记后仍然在线。
我尝试将 SecurityStampValidationInterval 设置为 zero,1 秒,但似乎没有任何效果。
此时我不确定这是否是错误?还是我做错了什么?
这是我的IdentityOptions 的样子:
services.Configure<IdentityOptions>(options =>
{
options.Tokens.PasswordResetTokenProvider = _defaultTokenProviderName;
options.Password.RequireDigit = true;
options.Password.RequiredLength = 6;
options.Password.RequireLowercase = true;
options.Password.RequireUppercase = true;
options.Password.RequireNonAlphanumeric = false;
options.User.RequireUniqueEmail = true;
options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.";
options.SecurityStampValidationInterval = TimeSpan.Zero;
options.Cookies.ApplicationCookie.CookieName = "Identity_cookie";
options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromHours(1);
options.Cookies.ApplicationCookie.SlidingExpiration = true;
options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents()
{
OnRedirectToLogin = (context) =>
{
var cul = context.HttpContext.Features.Get<IRequestCultureFeature>();
var lang = cul.RequestCulture.Culture.TwoLetterISOLanguageName;
context.Response.Redirect($"/{lang}/Account/Login?{context.Options.ReturnUrlParameter}" +
$"={System.Net.WebUtility.UrlEncode(context.Request.Path + context.Request.QueryString)}");
return Task.FromResult(0);
},
};
});
这就是我更新安全标记的方式:
user.Blocked = !user.Blocked;
await _userManager.UpdateSecurityStampAsync(user);
await _userManager.UpdateAsync(user);
提前致谢。
【问题讨论】:
-
您似乎已扩展 ApplicationUser 以添加 Blocked 属性?为什么不设置应该达到相同结果的 LockoutEnd 呢?另外,我建议您查看 UpdateSecurityStampAsync 和 UpdateAsync 返回的 IdentityResult,以确保 Succeeded 为真。
-
是的,我正在扩展
IdentityUser以添加一些属性,例如DisplayNameBlockedProfileImage。使用 lockoutEnd 作为阻止因素的问题是,我们可能会在尝试 30 分钟左右 10 次错误后使用它来锁定帐户。因此,根据锁定状态阻止用户的帖子并不好,但我将尝试看看它是否对验证SecurityStamp有任何影响。 -
关于检查
IdentityResult都成功并且数据库值与securityStamp一起更改,我什至手动更改它以查看它是否对登录用户有任何影响但没有。我还尝试删除/更改expireTimeSpan和SlidimgExpiration以检查它是否与security stamp validator接口,但没有运气。 -
也许将
options.OnSecurityStampRefreshingPrincipal = c => { return Task.FromResult(0); };添加到 services.AddIdentity 并设置断点以查看它是否被命中? -
试过了,据我所知,断点永远不会被击中。尝试使用和不使用
expireTimeSpan,SlidingExpiration。我今天可能会尝试将Microsoft.Aspnetcore.Authentication更新为2 preview版本,看看是否有什么不同。
标签: c# asp.net-core asp.net-core-mvc asp.net-core-1.1 asp.net-core-identity