Asp.net 核心 1.1 验证安全标记不起作用
Asp.net core 1.1 validate security stamp isn't working
好的,我已经为此苦苦挣扎了 2 天,但找不到任何相关信息。
我正在使用 asp.net 核心 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);
提前致谢。
我更新了我的问题以包含其余代码(抱歉,它在 service.AddIdentity..
下,所以我忘了复制它)。
所以我的问题是关于设置 options.Cookies.ApplicationCookie.Events
以便使用身份选项中的自定义 OnRedirectToLogin
出于某种原因我不得不将其移动到 app.UseCookieAuthentication()
我的新密码是:
app.UseIdentity();
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
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);
},
}
});
和services.Configure<IdentityOptions>
:
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;
我不知道这是一个错误还是什么,但配置应该在 ConfigureServices
里面,对吗?
好的,我已经为此苦苦挣扎了 2 天,但找不到任何相关信息。
我正在使用 asp.net 核心 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);
提前致谢。
我更新了我的问题以包含其余代码(抱歉,它在 service.AddIdentity..
下,所以我忘了复制它)。
所以我的问题是关于设置 options.Cookies.ApplicationCookie.Events
以便使用身份选项中的自定义 OnRedirectToLogin
出于某种原因我不得不将其移动到 app.UseCookieAuthentication()
我的新密码是:
app.UseIdentity();
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
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);
},
}
});
和services.Configure<IdentityOptions>
:
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;
我不知道这是一个错误还是什么,但配置应该在 ConfigureServices
里面,对吗?