Net Core Role Manager:使用通用类型'RoleManager <trole>'需要1个类型参数

时间:2019-04-20 17:01:25

标签: c# asp.net-core asp.net-core-2.0 asp.net-core-identity

我正在将项目从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。不确定是否要应用两个库是否正确。

1 个答案:

答案 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)
    {
    }
}