我有两个与此相关的问题:
1)我需要在添加/后无效.AspNet.ApplicationCookie 使用Asp.Net Identity将一些远程用户移除到角色2.我试过 使用UpdateSecurityStamp,但因为没有密码或用户名 更改,SecurityStamp保持不变。当我使用ApplicationRoleManger时 我可以看到用户角色已更新但在User.Identity声明他们 保持不变。
2).AspNet.ApplicationCookie验证如何工作以及如何工作? 访问它?
我试图使用此代码,但没有效果
What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface?
更新:这是我的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);
}
}
}
});
我可以看到user.GenerateUserIdentityAsync(manager)仅在登录时被命中。
答案 0 :(得分:8)
设置CookieAuthenticationOptions是不够的。当我在VS中创建新的ASP.NET MVC项目时,一切正常,并且每个请求都会触发GenerateUserIdentityAsync()(如果validateInterval为0)。唯一的问题是你必须为每个请求注册上下文:
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
当我使用Winsdor Castle为每个请求创建上下文时,我从模板中删除了这些行。 在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());
答案 1 :(得分:5)
如果要在添加到角色后更改安全标记,请使用以下命令:
UserManager.UpdateSecurityStampAsync(User.Id)
并且不要将validateInterval
设置为TimeSpan.FromSeconds(0)
- 这基本上意味着数据库将根据请求被点击。设置为10分钟。
就在昨晚I've blogged about CookieAuthenticationProvider
以及它如何使Cookie无效。基本上,cookie包含有关创建时间的信息。如果它早于validateInterval
,则访问数据库,获取用户记录并比较cookie和DB中的安全标记。如果邮票未更改,请发布包含新发布日期的新Cookie。如果邮票不匹配,则使cookie和注销用户无效。