我使用以下方法创建了一个测试项目:
dotnet new razor --auth Individual --output Test
这会创建一个包含以下内容的Startup.c ..
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.UseSqlite(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
我想为一些用户和角色提供种子。用户和角色都将使用同一个商店(SQLite)。我正在使用静态类进行播种,它是从Program
调用的。
我可以播种用户,但不能播放角色,因为上面的内容似乎没有注入RoleManager
。
在ASP.NET Core 2.0中使用以下内容:
services.AddIdentity<IdentityUser, IdentityRole>()
我猜测AddDefaultIdentity
在2.1中是新的,但问题是它没有注入RoleMnager
,所以我该怎么做?
答案 0 :(得分:19)
似乎最终微软明白并非每个应用程序都需要角色并将它们分开。
请注意AddDefaultIdentity
声明为:
public static IdentityBuilder AddDefaultIdentity<TUser>(this IServiceCollection services) where TUser : class;
因此,您可以继续通过IdentityBuilder
配置身份选项。你想要做的是:
services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>();
幸运的是,他们还删除了IUser
和IRole
约束,因此现在您可以在完全独立的程序集中使用模型,而无需安装数百个NuGet包。
答案 1 :(得分:11)
可能会帮助其他人:如果您通过脚手架将asp.net身份添加到现有项目中,则需要编辑IdentityHostingStartup.cs
并在那里更改服务,而不是在启动类中:
services.AddIdentity<AppUser, IdentityRole>()
.AddDefaultUI()
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<authContext>();
然后您可以在播种中使用角色管理器。
答案 2 :(得分:4)
除了已经提供的答案之外,尽管添加了.AddRoles<Identity>()
,但在控制器上使用Authorize(Roles = "Administrator")
时仍然无法获得授权。由于某种原因,“角色声明似乎不影响角色名称的IsUserInRole或AuthorizeAttribute。”
要利用角色,我建议一种使用ASP.NET 2.0的方式,如下所示:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
通过这种方式,您不仅可以使用自己的角色,还可以为您架设身份页面。
在aspnet github上参考此问题: Issue 1813
答案 3 :(得分:1)
从.Net Core 2.1开始,AddDefaultIdentity
与调用相同:
AddIdentity
AddDefaultUI
AddDefaultTokenProviders
要添加角色功能,请转到Startup.cs
下的ConfigureServices
,您可以像这样使用.AddRoles
:
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>() //<-- This line
.AddEntityFrameworkStores<ApplicationDbContext>();
仅此而已。注销并再次登录至关重要。
为了记录(为了测试),我尝试了services.AddIdentity
:
IServiceCollection不包含对'AddIdentity'的定义...
和services.AddIdentityCore
(在“调试并显示页面”之前没有错误):
InvalidOperationException:未指定authenticationScheme,并且 找不到DefaultChallengeScheme。默认方案可以是 使用AddAuthentication(string defaultScheme)或 AddAuthentication(操作configureOptions)。
要使后两个功能正常工作,您可以做更多的工作,但是我要为AddDefaultIdentity
发布的代码是使User.IsInRole
和其他角色功能在.NET Core中正常工作所需要的。 2.1(和3.1)。
答案 4 :(得分:0)
我也曾在这个问题上作过斗争。我无法扮演角色。
在我的项目中,我使用了ASP.NET Core 2.1(可以在2.2中修复,请参见链接),还使用了一些页面。
在互联网上进行长时间搜索后,我发现了该解决方案(上面在Issue 1813中也提到过)
解决方案是针对我的(如本文中所建议的),使用IUserClaimsPrincipalFactory添加以下行:
services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>,
UserClaimsPrincipalFactory<IdentityUser, IdentityRole>>();
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<TranslatorDbContext>();