如何在 ASP.NET Core 2.1 中使用角色?
How to use Roles in ASP.NET Core 2.1?
我使用以下方法创建了一个测试项目:
dotnet new razor --auth Individual --output Test
这将创建一个 Startup.cs,其中包含:
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)。我正在使用静态 class 进行播种,它是从 Program
.
调用的
我可以播种用户,但不能播种角色,因为上面似乎没有注入 RoleManager
。
在 ASP.NET Core 2.0 中使用了以下内容:
services.AddIdentity<IdentityUser, IdentityRole>()
我猜 AddDefaultIdentity
是 2.1 中的新功能,但问题是它没有注入 RoleMnager
,所以我该怎么办?
看来微软终于明白并不是每个应用程序都需要角色并将它们分开。
注意 AddDefaultIdentity
声明为:
public static IdentityBuilder AddDefaultIdentity<TUser>(this IServiceCollection services) where TUser : class;
因此,您可以继续通过 IdentityBuilder
配置身份选项。你要做的是:
services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>();
幸运的是,他们还删除了 IUser
和 IRole
约束,因此现在您可以在完全独立的程序集中使用模型,而无需安装数百个 NuGet 包。
可能会帮助其他人:如果您通过脚手架将 asp.net 身份添加到现有项目,您将需要编辑 IdentityHostingStartup.cs
并更改那里的服务,而不是在您的启动 class:
services.AddIdentity<AppUser, IdentityRole>()
.AddDefaultUI()
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<authContext>();
然后你可以在你的播种中使用角色管理器。
除了已经提供的答案外,尽管添加了.AddRoles<Identity>()
,但在我的控制器上使用Authorize(Roles = "Administrator")
时仍然无法获得授权。由于某种原因,"role claim doesn't seem to affect IsUserInRole or AuthorizeAttribute with a role name."
要使用角色,我建议使用 ASP.NET 2.0 方式,如下所示:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
通过这种方式,您可以使用自己的角色,还可以获得为您构建的身份页面。
参考aspnet上的这个问题github:
Issue 1813
我前段时间也遇到过这个问题。我无法让角色发挥作用。
在我的项目中,我使用了 ASP.NET Core 2.1(它可以在 2.2 中修复,请参阅 link)并且还构建了一些页面。
在网上搜索了很长时间后,我找到了这个解决方案(上面Issue 1813中也提到了)
我的解决方案(如文章中所建议的那样)在 IUserClaimsPrincipalFactory 中添加以下行:
services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>,
UserClaimsPrincipalFactory<IdentityUser, IdentityRole>>();
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<TranslatorDbContext>();
从 .Net Core 2.1 开始,AddDefaultIdentity
等同于调用:
AddIdentity
AddDefaultUI
AddDefaultTokenProviders
要添加角色功能,请转到 ConfigureServices
下的 Startup.cs
您可以像这样使用 .AddRoles
:
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>() //<-- This line
.AddEntityFrameworkStores<ApplicationDbContext>();
这就是所有需要的。注销再登录很关键
作为记录(并且只是为了测试),我尝试了 services.AddIdentity
:
IServiceCollection does not contain a defintion for 'AddIdentity'...
和services.AddIdentityCore
(调试并显示页面之前没有错误):
InvalidOperationException: No authenticationScheme was specified, and
there was no DefaultChallengeScheme found. The default schemes can be
set using either AddAuthentication(string defaultScheme) or
AddAuthentication(Action configureOptions).
您可以做更多的事情来让后两个工作,但我为 AddDefaultIdentity
发布的代码是我需要的所有代码,以便让 User.IsInRole
和其他角色功能在 . NET 核心 2.1(和 3.1)。
我使用以下方法创建了一个测试项目:
dotnet new razor --auth Individual --output Test
这将创建一个 Startup.cs,其中包含:
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)。我正在使用静态 class 进行播种,它是从 Program
.
我可以播种用户,但不能播种角色,因为上面似乎没有注入 RoleManager
。
在 ASP.NET Core 2.0 中使用了以下内容:
services.AddIdentity<IdentityUser, IdentityRole>()
我猜 AddDefaultIdentity
是 2.1 中的新功能,但问题是它没有注入 RoleMnager
,所以我该怎么办?
看来微软终于明白并不是每个应用程序都需要角色并将它们分开。
注意 AddDefaultIdentity
声明为:
public static IdentityBuilder AddDefaultIdentity<TUser>(this IServiceCollection services) where TUser : class;
因此,您可以继续通过 IdentityBuilder
配置身份选项。你要做的是:
services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>();
幸运的是,他们还删除了 IUser
和 IRole
约束,因此现在您可以在完全独立的程序集中使用模型,而无需安装数百个 NuGet 包。
可能会帮助其他人:如果您通过脚手架将 asp.net 身份添加到现有项目,您将需要编辑 IdentityHostingStartup.cs
并更改那里的服务,而不是在您的启动 class:
services.AddIdentity<AppUser, IdentityRole>()
.AddDefaultUI()
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<authContext>();
然后你可以在你的播种中使用角色管理器。
除了已经提供的答案外,尽管添加了.AddRoles<Identity>()
,但在我的控制器上使用Authorize(Roles = "Administrator")
时仍然无法获得授权。由于某种原因,"role claim doesn't seem to affect IsUserInRole or AuthorizeAttribute with a role name."
要使用角色,我建议使用 ASP.NET 2.0 方式,如下所示:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
通过这种方式,您可以使用自己的角色,还可以获得为您构建的身份页面。
参考aspnet上的这个问题github: Issue 1813
我前段时间也遇到过这个问题。我无法让角色发挥作用。
在我的项目中,我使用了 ASP.NET Core 2.1(它可以在 2.2 中修复,请参阅 link)并且还构建了一些页面。
在网上搜索了很长时间后,我找到了这个解决方案(上面Issue 1813中也提到了)
我的解决方案(如文章中所建议的那样)在 IUserClaimsPrincipalFactory 中添加以下行:
services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>,
UserClaimsPrincipalFactory<IdentityUser, IdentityRole>>();
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<TranslatorDbContext>();
从 .Net Core 2.1 开始,AddDefaultIdentity
等同于调用:
AddIdentity
AddDefaultUI
AddDefaultTokenProviders
要添加角色功能,请转到 ConfigureServices
下的 Startup.cs
您可以像这样使用 .AddRoles
:
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>() //<-- This line
.AddEntityFrameworkStores<ApplicationDbContext>();
这就是所有需要的。注销再登录很关键
作为记录(并且只是为了测试),我尝试了 services.AddIdentity
:
IServiceCollection does not contain a defintion for 'AddIdentity'...
和services.AddIdentityCore
(调试并显示页面之前没有错误):
InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action configureOptions).
您可以做更多的事情来让后两个工作,但我为 AddDefaultIdentity
发布的代码是我需要的所有代码,以便让 User.IsInRole
和其他角色功能在 . NET 核心 2.1(和 3.1)。