MiniProfiler ASP.NET Core-基于用户角色的ShouldProfile

问题描述

我在ASP.NET Core应用程序中设置了MiniProfiler。分析工作正常。

但是,我只希望管理员能够进行个人资料配置。

我在ConfigureServices中具有以下内容

services.AddMiniProfiler(options =>
{
    options.ShouldProfile = request =>
        request.HttpContext.User.IsInRole("Admin");
});

问题是,该方法似乎未加载用户身份。
User.Identity.Name属性为null,并且没有声明。
我的猜测是此呼叫是在填充该信息之前发生的?

如何根据用户身份进行配置文件

解决方法

您需要知道,根据the docsClaimsPrincipal.IsInRole()方法会检查类型为ClaimsIdentity.RoleClaimType的Claims。请确保已添加角色Claims。

这是一个您可以遵循的演示程序:

1。成功注册名称为a@qq.com的用户。

2。生成角色并向用户添加带有声明的角色:

public async Task CreateRolesandUsers()
{
    bool x = await _roleManager.RoleExistsAsync("Admin");
    if (!x)
    {
        // first we create Admin role   
        var role = new IdentityRole();
        role.Name = "Admin";
        await _roleManager.CreateAsync(role);
         
         //must add the claim,otherwise IsInRole would always be false..
        _roleManager.AddClaimAsync(role,new Claim(ClaimTypes.AuthorizationDecision,"Admin")).Wait();
    }
    var user = _userManager.FindByNameAsync(User.Identity.Name).Result;
    if (user != null)
    {
        var result1 = await _userManager.AddToRoleAsync(user,"Admin");
    }
}

2.Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser,IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultUI();

    services.AddMiniProfiler(options =>
    {
        options.RouteBasePath = "/profiler";
        options.ShouldProfile = request =>
request.HttpContext.User.IsInRole("Admin");
        options.SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter();
    });
    services.AddControllersWithViews();
    services.AddRazorPages();
}

public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
{
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();  //be sure add this
    app.UseAuthorization();  

    app.UseMiniProfiler();     //add this before UseEndpoints

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
        endpoints.MapRazorPages();
    });
}

结果:

enter image description here