'[授权(角色= "Role" )]'不起作用,User.IsInRole( "Role" ) 总是假



我觉得我错过了什么。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);
}

控制器中的用户管理器构造函数调用:

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

当您创建角色时...确保在将角色名称保存到数据库时,角色名称之前或之后没有多余的空格。我浪费了3/4天的时间试图追查为什么会发生这种情况。

看起来您具有"系统管理员">角色,并且可能是许多其他角色。

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

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

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

相关内容

  • 没有找到相关文章

最新更新