我正在使用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()
为什么不能用于我的主页(登录后)?
谢谢。
答案 0 :(得分:1)
如果使用.Net Core,则需要进行设置:
已编辑
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>>();
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");
}