c# - 如何在我的 asp.net core 3.1 应用程序中播种用户和角色?
问题描述
我尝试protected override void OnModelCreating(ModelBuilder builder)
在我的 IdentityDataContext 类中使用并创建一个将为这些数据提供种子的迁移:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
const string ADMIN_ID = "b4280b6a-0613-4cbd-a9e6-f1701e926e73";
const string ROLE_ID = ADMIN_ID;
builder.Entity<IdentityRole>().HasData(new IdentityRole
{
Id = ROLE_ID,
Name = "admin",
NormalizedName = "ADMIN"
});
builder.Entity<MyIdentityUser>().HasData(new MyIdentityUser
{
Id = ADMIN_ID,
UserName = "myemail@myemail.com",
NormalizedUserName = "MYEMAIL@MYEMAIL.COM",
Email = "myemail@myemail.com",
NormalizedEmail = "MYEMAIL@MYEMAIL.COM",
EmailConfirmed = true,
PasswordHash = "AQABBAEABCcQAABAEBhd37krE/TyMklt3SIf2Q3ITj/dunHYr7O5Z9UB0R1+dpDbcrHWuTBr8Uh5WR+JrQ==",
SecurityStamp = "VVPCRDAS3MJWQD5CSW2GWPRADBXEZINA",
ConcurrencyStamp = "c8554266-b401-4519-9aeb-a9283053fc58"
});
builder.Entity<IdentityUserRole<string>>().HasData(new IdentityUserRole<string>
{
RoleId = ROLE_ID,
UserId = ADMIN_ID
});
}
这似乎有效,但我无法访问用 Authorize 属性装饰的 Razor 页面中的端点。这很奇怪,因为我的数据库中有所有这些数据。我可以以该用户身份登录,我看到 AspNetRoles 表中有“管理员”角色。我还在 AspNetUserRoles 表中正确地将用户映射到角色。
[Authorize(Roles="admin")]
public class IndexModel : PageModel
{
public async Task<IActionResult> OnGetAsync()
{
return Page();
}
}
当以用户身份登录时,我被重定向到拒绝访问页面,根据数据库具有管理员角色的用户。
我看到有些人尝试在 Startup 类的 Configure 方法中执行此种子方法,但是当我尝试使用 RoleManager 和 UserManager 执行此操作时,我目前遇到了依赖注入问题:
System.InvalidOperationException: No service for type 'Microsoft.AspNetCore.Identity.RoleManager`1[Microsoft.AspNetCore.Identity.IdentityRole]' has been registered.
解决方案
我快到了。一开始并不明显,但我需要.AddRoles<IdentityRole>()
在 IdentityHostingStartup.cs 文件的 Configure 方法中添加一行。
它在 asp.net core 3.1 文档中基于角色的授权页面的末尾提到: 链接到文档
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddControllersWithViews();
services.AddRazorPages();
}
我认为角色已经被考虑在内,我不需要明确添加这个功能。
应该在页面顶部声明,为了添加基于角色的授权,您需要添加.AddRoles<IdentityRole>()
到您的 Configure 方法。相反,您会看到许多 Authorization 属性的组合,然后在底部有一个简短的段落“将角色服务添加到身份”,它没有解释这就是使这一切正常工作的原因。
推荐阅读
- python - 使用 scrapy 获取部分数据抓取站点,而相同的 url 让我从 shell 获取完整结果
- postgresql - 选择 where 条件 if 存在 else 其他条件限制 X
- osgi - AEM 6.4.x/OSGI/Servlet:如何从 servlet 访问 OSGI 服务?
- javascript - css模块,提取属性写内联样式
- java - Android Studio - 如何修复使用 flag_activity_clear_task 后返回按钮仍然有效的问题 | flag_activity_new_task?
- jmespath - 有没有办法从顶部数组访问值,同时使用 jmespath 从嵌套数组中获取信息?
- ios - 如何更改与初始颜色不同的导航栏栏按钮项目颜色?
- python - 绘图右侧的刻度 un subplots environment
- alexa-skills-kit - Alexa Skills:如何使用 JOVO 将价值从一个意图发送到另一个意图
- c# - 使用 linq 表达式构建动态选择