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

时间:2013-12-06 16:05:38

标签: entity-framework asp.net-mvc-5 asp.net-identity

[Authorize(Roles = "Admin")]使用ASP.NET Identity在MVC 5 RTM中开箱即用吗?

我没有运气。请注意,[Authorize][Authorize(Users = "AdminUser")]工作正常,AspNetUserRoles和AspNetRoles表按照我的预期填充,在AdminUser用户和Admin角色之间建立关系。这个问题似乎与角色有关。

3 个答案:

答案 0 :(得分:12)

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

例如:

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

这是关于Using Claims in ASP.NET Identity

的文章

答案 1 :(得分:6)

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

  • DO: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>