2014-08-28 90 views
9

我有2点涉及到的问题:如何使用Asp.Net Identity 2将用户添加到角色后使.AspNet.ApplicationCookie无效?

1)我需要添加/删除 使用Asp.Net身份2.一些远程用户角色我试图 使用UpdateSecurityStamp后invalidate.AspNet.ApplicationCookie,但由于没有密码或用户名 已更改,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 (经理)仅在登录时才被触发。

回答

8

设置CookieAuthenticationOptions是不够的。当我在VS中创建新的ASP.NET MVC项目时,一切正常,并且每个请求都会碰到GenerateUserIdentityAsync()(如果validateInterval为0)。唯一的问题是,你必须按要求登记方面:

app.CreatePerOwinContext(ApplicationDbContext.Create); 
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

由于我使用Winsdor城堡创建每个请求的情况下,我删除了模板这些行。 在ApplicationUserManager.Create的注入方法中设置了UserTokenProvider,它可以实现神奇的perharps。

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

如果您使用的是自己的IoC,你可以解决依赖这种方式

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

并注册类型这种方式(例如,使用城堡Winsdor):

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

很棒!我完全错过了自己。很高兴为你效力! – trailmax 2014-08-28 22:40:05

5

如果你想添加到一个角色使用此之后更改安全印记:

UserManager.UpdateSecurityStampAsync(User.Id) 

而且不设置validateIntervalTimeSpan.FromSeconds(0) - 这基本上意味着数据库将被要求每击。将其设置为10分钟左右。

就在昨晚I've blogged about CookieAuthenticationProvider以及它如何使Cookie无效。基本上,cookie包含有关创建时间的信息。如果它大于validateInterval,则访问数据库,获取用户记录并比较cookie和数据库中的安全印章。如果邮票没有更改,请发行新的发行日期的cookie。如果邮票不匹配,则使cookie和注销用户无效。

+0

感谢您的博客链接!似乎,我仍然缺少一些东西,因为正如我所说的,GenerateUserIdentityAsync方法仅在登录时触发 - 所以OnValidateIdentity。即使我调用UpdateSecurityStampAsync(User.Id),cookie仍然保持不变。顺便说一句,我有零时间跨度只是为了测试。还有其他什么我在认证配置中缺少什么? – 2014-08-28 11:22:05

+0

尝试查杀所有的cookies并重新登录 – trailmax 2014-08-28 11:28:13

+0

我做了很多次。是不是SecurityStampValidator.OnValidateIdentity检查SecurityStamp和UserId的问题 - 并且它们保持不变?所以没有检测到变化? – 2014-08-28 11:36:35

相关问题