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

Posted

技术标签:

【中文标题】`[Authorize (Roles="Role")]` 不起作用,User.IsInRole("Role") 始终为 false【英文标题】:`[Authorize (Roles="Role")]` not working, User.IsInRole("Role") always 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>());

【问题讨论】:

【参考方案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"); blogs.msdn.microsoft.com/webdev/2013/10/20/… 这也不起作用。我尝试通过 ID 将用户添加到角色(这不会崩溃,这意味着它有效),它仍然说用户没有角色。

以上是关于`[Authorize (Roles="Role")]` 不起作用,User.IsInRole("Role") 始终为 false的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 本地开发时绕过或关闭[Authorize(Roles="")]

如何解决始终返回使用 [Authorize(Roles = "Manager")] 的未经授权状态?

ASP.NET Core 身份 [Authorize(Roles ="ADMIN")] 不起作用

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

为啥 [Authorize(Roles = "Admin")] 不能在具有 ASP.NET 标识的 MVC 5 RTM 中工作?

如何使用 <sec:authorize access="hasRole('ROLES)"> 来检查多个角色?