【问题标题】:`[Authorize (Roles="Role")]` not working, User.IsInRole("Role") always false`[Authorize (Roles="Role")]` 不起作用,User.IsInRole("Role") 始终为 false
【发布时间】:2019-03-06 10:20:35
【问题描述】:

我觉得我错过了什么。 Authorize 本身有效,但使用角色无效。 cshtml-Code 包含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 这样的身份表。我上周从 Forms-Authentication 迁移到 Identities,这可能是现在的问题。我是否必须相应地更改上下文?它继承自IdentityDbContext&lt;AppUser&gt;,这就是为什么我不能只添加AspUserstuff(因为它已经存在),但是当我在运行时查看上下文时,它不存在......

下一次编辑:我的角色经理缺少web.config。添加后,我的data context 想法似乎真的是真的。现在,抛出的错误是:'The entity type AppUser is not part of the model for the current context.'。我的上下文继承自IdentityDbContext&lt;AppUser&gt;,那为什么不包含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>());

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的提示,我确实做到了。它们在数据库中(表AspNetRoles)。评论老问题也没有错!
    【解决方案2】:

    您似乎拥有 “SystemAdministrator” 角色,并且可能还有许多其他角色。

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

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

    如果您具有相应的角色,请在您的数据库中进行交叉验证。

    【讨论】:

    • 在我的数据库中,表AspNetRoles 中存在一个角色“SystemAdministrator”。在表AspNetUserRoles 中,管理员用户使用他们的Id 和正确的RoleId。需要明确的是,我使用的是[Authorize (Roles ="SystemAdministrator")],这与我制作的更通用的标题不同。
    • 您的意思是向数据库中添加新角色吗?不确定,但是在控制器中为用户做AddToRole 什么都不做,这个角色仍然不考虑。
    • var _context = new ApplicationDbContext(); var UserManager = new UserManager(new UserStore(_context)); UserManager.AddToRole("UserName", "UserRole");
    • 这也不起作用。我尝试通过 ID 将用户添加到角色(这不会崩溃,这意味着它有效),它仍然说用户没有角色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2014-01-14
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多