我觉得我错过了什么。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")]
在数据库中交叉验证您是否具有相应的角色。