角色被授权属性允许时返回未经授权的角色

时间:2018-08-12 17:16:25

标签: c# entity-framework asp.net-core-mvc authorization asp.net-identity

我正在尝试使用身份和实体框架将管理员角色添加到我的ASPDotNet Core项目中。 目的是使管理员可以访问视图/控制器,从而使他们可以更改普通用户无法访问的网站。

这是我用来创建角色,超级用户和种子数据库的代码(此后我可能会创建种子数据库类,但我专注于首先使基础知识开始工作)。此代码目前位于我的启动类中。在configure方法中调用CreateSuperUser。

private async Task CreateSuperUser(IServiceProvider serviceProvider)
    {
        var _roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        var _userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();  
        IdentityResult result;

        var doesAdminRoleExist = await _roleManager.RoleExistsAsync("AdminRole");
        var doesBasicRoleExist = await _roleManager.RoleExistsAsync("BasicRole");

        if (!doesAdminRoleExist)
        {

            IdentityRole AdminRole = new IdentityRole("AdminRole");
            result = await _roleManager.CreateAsync(AdminRole);
            IdentityUser SuperUser = new IdentityUser() { Email = "superuser@superuser.com", PasswordHash = "SecureP@ssword!1234", UserName = "superuser@superuser.com", };
            var createSuperUser = await _userManager.CreateAsync(SuperUser, SuperUser.PasswordHash);
            if (createSuperUser.Succeeded)
            {
                await _userManager.AddToRoleAsync(SuperUser, AdminRole.Name);

            }
        }

        if (!doesBasicRoleExist)
        {
            IdentityRole BasicRole = new IdentityRole("BasicRole");
            result = await _roleManager.CreateAsync(BasicRole);
        }

    }

在我的Controller类中,我要求这样的授权

 [Authorize(Roles = "AdminRole")]
    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";

        return View();
    }

我可以使用superUser@superuser.com登录,但是当我尝试单击联系人链接时,它告诉我我无权访问此资源。 我根本无法弄清楚如何正确创建此自定义角色。我的具体问题是: 有人可以帮助我找到导致我无法按角色授权的错误

我已经花了很多时间阅读堆栈溢出,谷歌和Microsoft文档,所以请不要这样做。我的方法很大程度上基于此处其他用户的答案之一,而Microsoft文档是我桌面上的PDF。

我是编程新手,很难掌握所有内容。特别是2.0和2.1的差异。更不用说框架4.6了。

我为冗长的帖子表示歉意。预先感谢您的帮助。

另一方面,这里是我的configure方法,以防万一。我还从nuget的控制台运行了add-migration / update-database。

 public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));

        services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();
        services.AddAuthentication();
        services.AddAuthorization();
        services.AddMvc();

    }

public  void Configure(IApplicationBuilder app, IHostingEnvironment env,IServiceProvider serviceProvider)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseAuthentication();

        CreateSuperUser(serviceProvider).Wait();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

1 个答案:

答案 0 :(得分:1)

这是一个UserRoles in DefaultIdentity #1813被跟踪的错误。

要变通,请像下面一样更改代码

        //services.AddDefaultIdentity<IdentityUser>()
        //    .AddEntityFrameworkStores<ApplicationDbContext>();
        //services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>()
        //    .AddEntityFrameworkStores<ApplicationDbContext>()
        //    ;
        services.AddIdentity<IdentityUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultUI()
        .AddDefaultTokenProviders();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

已在Fix issue with role claim missing in AddIdentityCore #1832中跟踪的release/2.2中解决了此问题。

请注意,如果以上代码对您不起作用,由于该身份由Cookies保存,因此您可能需要注销并登录。