我正在ASP.NET Core(实体框架)中准备应用程序,在这里我希望某些功能仅限于特定用户。
要在Startup.cs中实现此目的,请添加以下代码 服务:
services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>
().AddEntityFrameworkStores<ApplicationDbContext>();
用于创建新的默认用户的类:
public static class MyIdentityDataInitializer
{
public static void SeedData(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)
{
SeedRoles(roleManager);
SeedUsers(userManager);
}
public static void SeedUsers(UserManager<IdentityUser> userManager)
{
if (userManager.FindByNameAsync("user@email.com").Result==null)
{
IdentityUser user = new IdentityUser();
user.UserName = "user@email.com";
user.Email = "user@email.com";
IdentityResult result = userManager.CreateAsync(user, "Admin1").Result; //Admin1 = password
if (result.Succeeded)
{
userManager.AddToRoleAsync(user, "Administrator").Wait(); //add user to role
}
}
}
public static void SeedRoles(RoleManager<IdentityRole> roleManager)
{
if (!roleManager.RoleExistsAsync("StandardUser").Result)
{
IdentityRole role = new IdentityRole();
role.Name = "StandardUser";
IdentityResult roleResult = roleManager.CreateAsync(role).Result;
}
if (!roleManager.RoleExistsAsync("Administrator").Result)
{
IdentityRole role = new IdentityRole();
role.Name = "Administrator";
role.NormalizedName = "Administrator";
IdentityResult roleResult = roleManager.CreateAsync(role).Result;
}
}
}
}
在“配置方法”中,我将其称为:
MyIdentityDataInitializer.SeedData(userManager, roleManager);
在我想限制动作的控制器中
[Authorize(Roles = "Administrator")]
public IActionResult ConfigurationPortal()
{
.....
}
当前情况是:
我可以在数据库中检查是否创建了用户和角色(数据库ASPNetUser,ASPNetRoles),也可以在数据库ASPNetUserRoles存在的行中将用户映射为管理员。 启动应用程序后,我可以登录,但是当我尝试打开ConfigurationPortal()(或其他受限制的方法)时,将显示“访问受限制”信息。看起来管理员用户未被识别为管理员。
预期情况是;将用户附加到角色管理员后,他们可以访问受限方法。
答案 0 :(得分:1)
启动应用程序后,我可以登录,但是当我尝试打开ConfigurationPortal()(或其他受限制的方法)时,将显示“访问受限制”信息。看来管理员用户未被识别为管理员。
这是2.1版本中的一个已知错误。参见issue。
我遵循using the old api suggested by HaoK and C-BERBER的建议,现在它可以正常工作了。
这是我的DbContext:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
使用旧式api配置身份:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
最后,注销并重新登录,它现在将按预期运行。