我正在尝试使用标识和实体框架工作向我的ASPDotNet Core项目添加管理员角色。 目标是授予管理员对视图/控制器的访问权限,以允许他们对普通用户无法访问的网站进行更改。
这是我用来创建角色、超级用户和种子数据库的代码(稍后我可能会创建一个种子数据库类,但我专注于首先获得基础知识(。这段代码目前存在于我的启动类中。在配置方法中调用创建超级用户。
private async Task CreateSuperUser(IServiceProvider serviceProvider)
{
var _roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var _userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
IdentityResult result;
var doesAdminRoleExist = await _roleManager.RoleExistsAsync("AdminRole");
var doesBasicRoleExist = await _roleManager.RoleExistsAsync("BasicRole");
if (!doesAdminRoleExist)
{
IdentityRole AdminRole = new IdentityRole("AdminRole");
result = await _roleManager.CreateAsync(AdminRole);
IdentityUser SuperUser = new IdentityUser() { Email = "superuser@superuser.com", PasswordHash = "SecureP@ssword!1234", UserName = "superuser@superuser.com", };
var createSuperUser = await _userManager.CreateAsync(SuperUser, SuperUser.PasswordHash);
if (createSuperUser.Succeeded)
{
await _userManager.AddToRoleAsync(SuperUser, AdminRole.Name);
}
}
if (!doesBasicRoleExist)
{
IdentityRole BasicRole = new IdentityRole("BasicRole");
result = await _roleManager.CreateAsync(BasicRole);
}
}
在我的控制器类中,我像这样请求授权
[Authorize(Roles = "AdminRole")]
public IActionResult Contact()
{
ViewData["Message"] = "Your contact page.";
return View();
}
我能够登录没有问题 superUser@superuser.com,但是当我尝试单击联系链接时,它告诉我我无法访问此资源。 我根本无法弄清楚如何正确创建此自定义角色。我的具体问题是:有人可以帮我找到流程中的错误,该错误阻止我按角色授权。
我花了很多时间阅读堆栈溢出,谷歌和Microsoft文档,所以请不要建议这样做。我的方法很大程度上基于此处其他用户的答案之一,Microsoft文档是我桌面上的PDF。
我是编程新手,很难掌握这一切。尤其是 2.0 和 2.1 的差异。更不用说框架 4.6 了。
对于长篇大论,我深表歉意。 提前感谢您的帮助。
附带说明一下,这是我的配置方法,以防万一它们有所帮助。我还从 nuget 的控制台运行了添加迁移/更新数据库。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthentication();
services.AddAuthorization();
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env,IServiceProvider serviceProvider)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
CreateSuperUser(serviceProvider).Wait();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
这是一个在 DefaultIdentity #1813 中跟踪 UserRoles 的错误。
要解决此问题,请按如下所示更改代码
//services.AddDefaultIdentity<IdentityUser>()
// .AddEntityFrameworkStores<ApplicationDbContext>();
//services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>()
// .AddEntityFrameworkStores<ApplicationDbContext>()
// ;
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
此问题已在跟踪的release/2.2
中修复 修复了 AddIdentityCore #1832 中缺少角色声明的问题。
请注意,如果上面的代码对您不起作用,您可能需要注销并登录,因为此身份由Cookies
保存。