[Authorize(Roles = "Admin")]
使用ASP.NET Identity在MVC 5 RTM中开箱即用吗?
我没有运气。请注意,[Authorize]
和[Authorize(Users = "AdminUser")]
工作正常,AspNetUserRoles和AspNetRoles表按照我的预期填充,在AdminUser用户和Admin角色之间建立关系。这个问题似乎与角色有关。
答案 0 :(得分:12)
用户可能需要重新进行身份验证才能接收包含Admin角色成员身份的新声明。由于MVC 5使用开箱即用的ASP.NET身份,并且默认情况下在MVC 5中使用,ASP.NET身份会在用户的cookie中存储类似角色的声明,这些信息可能会变得陈旧(因此数据库会说一件事,但用户的cookie说别的东西)。重新验证用户将刷新其声明,包括用户角色声明,以匹配数据库的当前状态。
如果用户在分配给数据库中的Admin角色之前登录,则该用户将被授予声明,但他们不会将其分配包含在Admin角色中。如果以后将它们添加到Admin角色,则不会自动更新存储在其Cookie中的声明。相反,只有数据库已更新,应用程序必须重新验证它们,然后旧的声明将被包含Admin角色成员资格的新声明替换。让用户手动注销并重新登录,是重新验证该用户的最明显方式。
的文章答案 1 :(得分:6)
答案是 UserManager的DbContext必须启用延迟加载,以便用户角色以通常的预期方式在应用程序中显示。事实证明,并非所有代码都是“开箱即用”。我曾经如此轻微地定制了我的DbContext。希望将来微软能够通过确保集合加载userDbContext.Users.Include(o => o.Roles).SingleOrDefault(...)
之类的东西来回避这个集成错误。
ApplicationDbContext.Configuration.LazyLoadingEnabled = true;
ApplicationDbContext.Configuration.LazyLoadingEnabled = false;
请注意,如果您的代码中未设置ApplicationDbContext.Configuration.LazyLoadingEnabled
,则默认为true
。因此,不要将该行设置为true
。
这是我对禁用延迟加载时发生的事情的猜测,当{User}或UserStore访问它时,Roles
/ IdentityUser
对象的ApplicationUser
属性为null或为空该集合未手动加载。然后代码继续进行,就像没有为用户分配任何角色,实际上这个集合从未加载过。
答案 2 :(得分:-3)
<system.webServer>
<modules>
<remove name="RoleManager" />
</modules>
</system.webServer>