`[[Authorize(Roles =“ Role”)]]不起作用,User.IsInRole(“ Role”)始终为假

时间:2018-10-01 10:11:23

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

我觉得我缺少什么。 Authorize本身有效,但使用角色无效。 cshtml代码包含razor的内容,我不确定是否可以将它们与基于角色的授权结合使用。此外,IsInRole始终返回false。

在我的数据库AspNetUserRoles中,角色实例在那里具有正确的RoleId和UserId。我将用户添加到数据库的Seed方法中的角色中。

if (!userManager.IsInRole(adminUser.Id, "SystemAdministrator"))
            userManager.AddToRole(adminUser.Id, "SystemAdministrator");

我是否需要将它们添加到其他位置,例如在某种角色管理器中?

我认为这是“启动中配置”的相关部分:

app.CreatePerOwinContext<RoleManager<AppRole>>((options, context) =>
            new RoleManager<AppRole>(
                new RoleStore<AppRole>(context.Get<MyANTon.DataContext.AntContext>())));

也许在此之后,我必须将用户添加到角色中?

编辑:我发现了可能的错误来源。我的db context似乎没有包括AspNetUserRoles甚至AspNetUsers之类的身份表。我上周从表单身份验证迁移到了身份,这现在可能是问题。我是否需要相应地更改上下文?它继承自IdentityDbContext<AppUser>,这就是为什么我不能只添加AspUser东西(因为它已经存在)的原因,但是当我在运行时查看上下文时,它就不存在了。

下一个编辑:我缺少角色经理的web.config。添加之后,看来我的data context想法实际上是对的。现在,抛出的错误是:'The entity type AppUser is not part of the model for the current context.'。我的上下文继承自IdentityDbContext<AppUser>,为什么它不包含AppUser

上下文类:

public class AntContext : IdentityDbContext<AppUser>
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<AntContext>(null);
        modelBuilder.Entity<AppUser>().ToTable("AppUsers");
        base.OnModelCreating(modelBuilder);
    }

控制器中的UserManager构造函数调用:

        private UserManager<AppUser> userManager = new UserManager<AppUser>(new UserStore<AppUser>());

2 个答案:

答案 0 :(得分:1)

在创建角色时,请确保将角色保存到数据库时,在“角色名称”之前或之后没有多余的空格。我浪费了一天的3/4,试图追查发生这种情况的原因。

答案 1 :(得分:0)

您似乎具有“系统管理员” 的角色,并且可能还有很多其他角色。

您应该使用[Authorize(Roles = "RoleName")]

例如:-[Authorize(Roles = "SystemAdministrator")]

在数据库中交叉验证您是否具有相应的角色。