我正在将项目从Net MVC迁移到MVC Core2。我在Role Manager最后一行看到以下错误。 Net Core中Role Manager的一般替代品是什么?
错误:
Using the generic type 'RoleManager<TRole>' requires 1 type arguments
代码:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
namespace HPE.Kruta.Web
{
public class CustomerRoleProvider : RoleManager
{
在修复中,它要求我除NetCore外还使用NetIdentity。不确定是否要应用两个库是否正确。
答案 0 :(得分:1)
Identity核心没有替代RoleManager的功能。这和以前一样。
默认情况下,您必须将IdentityRole
类传递给RoleManager
,这是Identity中的默认角色类。
如果要扩展IdentityRole
并为其添加自定义属性,则必须从IdentityRole
派生并向其中添加自定义道具:
public class ApplicationRole : IdentityRole
{
public string MyCustomProp { get; set; }
}
并且您必须在服务中注册自定义角色模型:
services.AddIdentity<IdentityUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
有了这些更改,现在要在RoleManager
上使用它,您必须将新的自定义ApplicationRole
传递给它。因此,Identity将管理该类,而不是默认的IdentityRole
一个类:
public class HomeController : ControllerBase
{
private readonly RoleManager<ApplicationRole> _roleManager;
public HomeController(RoleManager<ApplicationRole> roleManager)
{
_roleManager = roleManager;
}
}
最后,如果要扩展/自定义RoleManager
,则必须将自定义角色作为RoleManager
的通用参数传递:
public class CustomRoleManager : RoleManager<ApplicationRole>
{
public CustomRoleManager(IRoleStore<ApplicationRole> store,
IEnumerable<IRoleValidator<ApplicationRole>> roleValidators,
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
ILogger<RoleManager<ApplicationRole>> logger) :
base(store, roleValidators, keyNormalizer, errors, logger)
{
}
}