如何在使用Asp.Net标识2将用户添加到角色后使.AspNet.ApplicationCookie无效



我有两个问题与此相关:

1) 我需要作废。添加后的AspNet.ApplicationCookie/正在使用Asp.Net标识2将某些远程用户删除到角色。我试过使用UpdateSecurityStamp,但由于没有密码或用户名更改后,SecurityStamp保持不变。当我使用ApplicationRoleManger时我可以看到用户角色已更新,但在User.Identity声明中保持不变。

2) .AspNet.ApplicationCookie验证是如何工作的,以及我如何访问它?

我试图使用这个代码,但没有效果

什么是ASP.NET Identity';s IUserSecurityStampStore<TUser>界面

更新:这是我的Cookie验证设置:

 app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromSeconds(0),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),
                OnApplyRedirect = ctx =>
                {
                    if (!IsApiRequest(ctx.Request))
                    {
                        ctx.Response.Redirect(ctx.RedirectUri);
                    }
                }
            }
        });

我可以看到那个用户。GenerateUserIdentityAsync(管理器)仅在登录时命中。

设置CookieAuthenticationOptions是不够的。当我在VS中创建新的ASP.NET MVC项目时,一切都很好,每个请求都会命中GenerateUserIdentityAsync()(如果validateInterval为0)。唯一的问题是每个请求都必须注册上下文:
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

当我使用WinsdorCastle为每个请求创建上下文时,我从模板中删除了这些行。在ApplicationUserManager.Create中的注入方法中,设置了UserTokenProvider,它完成了神奇的perharps。

文档中没有任何关于这方面的内容,但它最终解决了问题。

如果你使用自己的IoC,你可以通过这种方式解决依赖关系(例如使用Castle Winsdor)

app.CreatePerOwinContext(() => IoCContainerManager.Container.Resolve<ApplicationDBContext>());
app.CreatePerOwinContext(() => IoCContainerManager.Container.Resolve<ApplicationUserManager>());

和寄存器类型如下:

container.Register(Component.For<ApplicationDBContext>().LifestylePerWebRequest());
container.Register(Component.For<ApplicationUserManager>().LifestylePerWebRequest());

如果您想在添加到角色后更改安全戳,请使用以下方法:

UserManager.UpdateSecurityStampAsync(User.Id)

并且不要将validateInterval设置为TimeSpan.FromSeconds(0)——这基本上意味着数据库在每次请求时都会被命中。设置为大约10分钟。

就在昨晚,我在博客上写了一篇关于CookieAuthenticationProvider以及它如何使cookie无效的文章。基本上,cookie包含有关创建时间的信息。如果它比validateInterval旧,那么访问数据库,获取用户记录,并比较cookie和数据库中的安全戳。如果邮票没有更改,则发行一个带有新发行日期的新cookie。如果stamp不匹配,则使cookie无效并注销用户。

相关内容

  • 没有找到相关文章

最新更新