我正在尝试使用身份和实体框架将管理员角色添加到我的ASPDotNet Core项目中。 目的是使管理员可以访问视图/控制器,从而使他们可以更改普通用户无法访问的网站。
这是我用来创建角色,超级用户和种子数据库的代码(此后我可能会创建种子数据库类,但我专注于首先使基础知识开始工作)。此代码目前位于我的启动类中。在configure方法中调用CreateSuperUser。
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);
}
}
在我的Controller类中,我要求这样的授权
[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了。
我为冗长的帖子表示歉意。预先感谢您的帮助。
另一方面,这里是我的configure方法,以防万一。我还从nuget的控制台运行了add-migration / update-database。
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?}");
});
}
答案 0 :(得分:1)
这是一个UserRoles in DefaultIdentity #1813被跟踪的错误。
要变通,请像下面一样更改代码
//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);
已在Fix issue with role claim missing in AddIdentityCore #1832中跟踪的release/2.2
中解决了此问题。
请注意,如果以上代码对您不起作用,由于该身份由Cookies
保存,因此您可能需要注销并登录。