为什么@ User.IsInRole在_Layout.cshtml中总是返回false

时间:2019-05-15 14:06:06

标签: c# asp.net asp.net-core razor

我正在使用Razor-Pages开发Web应用程序。我想在_Layout.cshtml文件中根据当前用户的角色更改菜单。 因此,我使用User.IsInRole(string role),但它始终返回false。

在类似的问题中,我读到,登录后无法立即以某种方式检索用户角色。但是,我不明白为什么会这样。

我的代码:

@if (User.IsInRole(Roles.Admin.ToString())) {
  <li><a asp-page="/AdminMenuPoint">Admin Menu</a>a/li>
}

我的角色枚举:

public enum Roles {
  Supervisor, Admin
};

总结一下:User.IsInRole()为什么不能用于我的主页(登录后)?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果使用.Net Core,则需要进行设置:

  1. 在Startup.cs中添加身份服务

已编辑

services.AddDefaultIdentity<ApplicationUser>()
   .AddRoles<IdentityRole>() // <-- Add this line
    .AddEntityFrameworkStores<ApplicationDbContext>();

根据this discussion on GitHub,要获得要显示在Cookie中的角色和声明,需要 恢复为service.AddIdentity初始化代码,或者坚持使用service.AddDefaultIdentity并将这行代码添加到ConfigureServices

// Add Role claims to the User object
// See: https://github.com/aspnet/Identity/issues/1813#issuecomment-420066501
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>>();
  1. 创建角色并为角色分配用户
private async Task CreateUserRoles(IServiceProvider serviceProvider)
{
 var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
 var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();

 IdentityResult roleResult;
 //Adding Admin Role
 var roleCheck = await RoleManager.RoleExistsAsync("Admin");
 if (!roleCheck)
 {
 //create the roles and seed them to the database
 roleResult = await RoleManager.CreateAsync(new IdentityRole("Admin"));
 }
 //Assign Admin role to the main User here we have given our newly registered 
 //login id for Admin management
 ApplicationUser user = await UserManager.FindByEmailAsync("syedshanumcain@gmail.com");
 var User = new ApplicationUser();
 await UserManager.AddToRoleAsync(user, "Admin");
}

enter image description here