为什么[Authorize(Roles ="Admin")]不能使用ASP.NET身份在MVC 5 RTM中工作?

Jer*_*ook 14 entity-framework asp.net-mvc-5 asp.net-identity

[Authorize(Roles = "Admin")]开箱的MVC 5 RTM与ASP.NET身份

我没有运气.请注意,[Authorize]并且[Authorize(Users = "AdminUser")]工作得很好,AspNetUserRoles和AspNetRoles表按照我的预期填充,在AdminUser用户和Admin角色之间建立关系.此问题似乎特定于角色.

Jer*_*ook 12

用户可能需要重新进行身份验证才能接收包含Admin角色成员身份的新声明.由于MVC 5开箱即用,而且默认情况下在MVC 5中使用ASP.NET身份,因此ASP.NET身份会在用户的cookie中存储类似角色的声明,这些信息可能会变得陈旧(因此数据库说一件事,但用户的cookie说别的东西).重新验证用户将刷新其声明,包括用户角色声明,以匹配数据库的当前状态.

例如:

如果用户在分配给数据库中的Admin角色之前登录,则该用户将被授予声明,但他们不会将其分配包含在Admin角色中.如果以后将它们添加到Admin角色,则不会自动更新存储在其Cookie中的声明.相反,只有数据库已更新,应用程序必须重新验证它们,然后旧的声明将被包含Admin角色成员资格的新声明替换.让用户手动注销并重新登录,是重新验证该用户的最明显方式.

这是一篇关于在ASP.NET身份中使用声明的文章


Jer*_*ook 6

答案是UserManager的DbContext必须启用延迟加载才能使用户角色以通常的预期方式在应用程序中显示.事实证明,并非所有代码都是"开箱即用".我曾经如此轻微地定制了我的DbContext.希望将来微软能够通过确保集合加载类似的东西来回避这个集成错误userDbContext.Users.Include(o => o.Roles).SingleOrDefault(...).

  • 做: ApplicationDbContext.Configuration.LazyLoadingEnabled = true;
  • 不要: ApplicationDbContext.Configuration.LazyLoadingEnabled = false;

请注意,如果ApplicationDbContext.Configuration.LazyLoadingEnabled未在代码中设置,则默认为true.所以不要设置它就行了true.

等等.

这是我对禁用延迟加载时发生的事情的猜测,当UserManager或UserStore访问它时,/ object 的Roles属性为null或为空,因为该集合未被手动加载.然后代码继续进行,就像没有为用户分配任何角色,实际上该集合从未被加载过.IdentityUserApplicationUser

啊,沉默失败的香气.如果事情看起来不正确,代码只会发出一些噪音.