【问题标题】:Asp.net core 1.1 validate security stamp isn't workingAsp.net core 1.1 验证安全标记不起作用
【发布时间】: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 以添加一些属性,例如 DisplayName Blocked ProfileImage。使用 lockoutEnd 作为阻止因素的问题是,我们可能会在尝试 30 分钟左右 10 次错误后使用它来锁定帐户。因此,根据锁定状态阻止用户的帖子并不好,但我将尝试看看它是否对验证 SecurityStamp 有任何影响。
  • 关于检查IdentityResult 都成功并且数据库值与securityStamp 一起更改,我什至手动更改它以查看它是否对登录用户有任何影响但没有。我还尝试删除/更改expireTimeSpanSlidimgExpiration 以检查它是否与security stamp validator 接口,但没有运气。
  • 也许将 options.OnSecurityStampRefreshingPrincipal = c =&gt; { 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


【解决方案1】:

我更新了我的问题以包含其余代码(抱歉,它在 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&lt;IdentityOptions&gt;:

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 内,对吗?

【讨论】:

  • 您可能应该使用 asp.net-core-identity 标记此问题或在github.com/aspnet/Identity 创建问题以获得更好的响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2021-09-24
相关资源
最近更新 更多