首页 > 解决方案 > .net 核心身份 2.1 角色授权不起作用

问题描述

在 2.1 之前,我已经多次实施基于角色的身份验证。按照步骤搭建新的 2.1 标识。

我扩展了 IdentityUser 模型以添加其他字段,登录工作正常,新字段出现。

startup.cs 配置服务包含

         services.AddDefaultIdentity<AppUser>()
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

我播种了角色

         IdentityRole role = new IdentityRole();
         role.Name = "Administrator";
         IdentityResult roleResult = roleManager.
         CreateAsync(role).Result;

然后创建一个用户并添加到角色

        AppUser user = new AppUser();
        user.UserName = "Admin";
        user.Email = "admin@admin.com";
        user.Name = "Administrator";
        user.LockoutEnabled = false;
        user.EmailConfirmed = true;

        IdentityResult result = userManager.CreateAsync(user, "password").Result;

        if (result.Succeeded)
        {
            userManager.AddToRoleAsync(user, "Administrator").Wait();
        }

一切都成功了,数据库看起来很好(AspNetUserRoles 有链接)

但是,使用角色装饰控制器将始终返回未授权

       [Authorize(Roles = "Administrator")]

[Authorize]但是,使用(无角色)的简单登录检查将起作用。

我该如何解决这个问题/合并源代码的最简单方法是什么,以便我可以单步执行/调试[Authorize]标签?

标签: asp.net-coreasp.net-core-mvcasp.net-core-identity

解决方案


怎么修

但是,使用角色装饰控制器将始终返回未授权

  [Authorize(Roles = "Administrator")]

这是版本中的一个已知错误2.1。请参阅此处的问题

我遵循使用 HaoK 和 C-BERBER 建议的旧 api 的建议,它现在可以完美运行。

这是我的DbContext

public class ApplicationDbContext : IdentityDbContext<AppUser,IdentityRole,string>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

使用旧式 api 配置身份:

services.AddIdentity<AppUser, IdentityRole>()
        .AddRoleManager<RoleManager<IdentityRole>>()
        .AddDefaultUI()
        .AddDefaultTokenProviders()
        .AddEntityFrameworkStores<ApplicationDbContext>();

最后,注销并重新登录,它现在将按预期工作。

如何调试源代码

我猜你不想调试它AuthorizeAttribe本身,因为它是在编译时处理的。如果您要调试AuthorizeFilter,可以按照以下步骤操作:

点击Tools-> Options->Debugging

  1. General取消选择Enable Just My CodeVisual Studio
  2. 选择Enable Source Link Support
  3. 在 中Symbols,确保选择了Microsoft Symbol Servers

你现在可以调试源代码了。但是,由于过滤器的工作方式,您需要在 MVC 之前设置一个断点。我只是设置了一个虚拟中间件,它将在 MVC 路由器处理程序之前发生:

在此处输入图像描述

调试截图AuthorizeFiler

在此处输入图像描述


推荐阅读