ASP.NET 5 vNext Dependencies Injection (RoleManager)

I am trying to pass to my controller a RoleManager like UserManager, but I have this error:

An unhandled error occurred while processing the request.

InvalidOperationException: Unable to enable service for type 'Microsoft.AspNet.Identity.RoleManager`1 [Web.MongoDBIdentitySample.Models.ApplicationRole] when trying to activate' Web.MongoDBIdentitySample.Controllers.AccountController '.

This is my ConfigureServices method:

// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // Registers MongoDB conventions for ignoring default and blank fields // NOTE: if you have registered default conventions elsewhere, probably don't need to do this RegisterClassMap<ApplicationUser, IdentityRole, string>.Init(); // Add Mongo Identity services to the services container. services.AddIdentity<ApplicationUser, IdentityRole>() .AddMongoDBIdentityStores<ApplicationDbContext, ApplicationUser, IdentityRole, string>(options => { options.ConnectionString = Configuration["Data:DefaultConnection:ConnectionString"]; // No default, must be configured if using (eg "mongodb://localhost:27017") // options.Client = [IMongoClient]; // Defaults to: uses either Client attached to [Database] (if supplied), otherwise it creates a new client using [ConnectionString] // options.DatabaseName = [string]; // Defaults to: "AspNetIdentity" // options.Database = [IMongoDatabase]; // Defaults to: Creating Database using [DatabaseName] and [Client] // options.UserCollectionName = [string]; // Defaults to: "AspNetUsers" // options.RoleCollectionName = [string]; // Defaults to: "AspNetRoles" // options.UserCollection = [IMongoCollection<TUser>]; // Defaults to: Creating user collection in [Database] using [UserCollectionName] and [CollectionSettings] // options.RoleCollection = [IMongoCollection<TRole>]; // Defaults to: Creating user collection in [Database] using [RoleCollectionName] and [CollectionSettings] // options.CollectionSettings = [MongoCollectionSettings]; // Defaults to: { WriteConcern = WriteConcern.WMajority } => Used when creating default [UserCollection] and [RoleCollection] // options.EnsureCollectionIndexes = [bool]; // Defaults to: false => Used to ensure the User and Role collections have been created in MongoDB and indexes assigned. Only runs on first calls to user and role collections. // options.CreateCollectionOptions = [CreateCollectionOptions]; // Defaults to: { AutoIndexId = true } => Used when [EnsureCollectionIndexes] is true and User or Role collections need to be created. // options.CreateIndexOptions = [CreateIndexOptions]; // Defaults to: { Background = true, Sparse = true } => Used when [EnsureCollectionIndexes] is true and any indexes need to be created. }) .AddDefaultTokenProviders(); services.AddIdentity<ApplicationRole, IdentityRole>() .AddMongoDBIdentityStores<ApplicationDbContext, ApplicationUser, IdentityRole, string>(options => { options.ConnectionString = Configuration["Data:DefaultConnection:ConnectionString"]; // No default, must be configured if using (eg "mongodb://localhost:27017") // options.Client = [IMongoClient]; // Defaults to: uses either Client attached to [Database] (if supplied), otherwise it creates a new client using [ConnectionString] // options.DatabaseName = [string]; // Defaults to: "AspNetIdentity" // options.Database = [IMongoDatabase]; // Defaults to: Creating Database using [DatabaseName] and [Client] // options.UserCollectionName = [string]; // Defaults to: "AspNetUsers" // options.RoleCollectionName = [string]; // Defaults to: "AspNetRoles" // options.UserCollection = [IMongoCollection<TUser>]; // Defaults to: Creating user collection in [Database] using [UserCollectionName] and [CollectionSettings] // options.RoleCollection = [IMongoCollection<TRole>]; // Defaults to: Creating user collection in [Database] using [RoleCollectionName] and [CollectionSettings] // options.CollectionSettings = [MongoCollectionSettings]; // Defaults to: { WriteConcern = WriteConcern.WMajority } => Used when creating default [UserCollection] and [RoleCollection] // options.EnsureCollectionIndexes = [bool]; // Defaults to: false => Used to ensure the User and Role collections have been created in MongoDB and indexes assigned. Only runs on first calls to user and role collections. // options.CreateCollectionOptions = [CreateCollectionOptions]; // Defaults to: { AutoIndexId = true } => Used when [EnsureCollectionIndexes] is true and User or Role collections need to be created. // options.CreateIndexOptions = [CreateIndexOptions]; // Defaults to: { Background = true, Sparse = true } => Used when [EnsureCollectionIndexes] is true and any indexes need to be created. }) .AddDefaultTokenProviders(); // Add MVC services to the services container. services.AddMvc(); // Add application services. services.AddTransient<IEmailSender, AuthMessageSender>(); services.AddTransient<ISmsSender, AuthMessageSender>(); } 

This is my AccountController class:

 public class AccountController : Controller { private readonly UserManager<ApplicationUser> _userManager; private readonly RoleManager<ApplicationRole> _roleManager; private readonly SignInManager<ApplicationUser> _signInManager; private readonly IEmailSender _emailSender; private readonly ISmsSender _smsSender; private readonly ILogger _logger; public AccountController( UserManager<ApplicationUser> userManager, RoleManager<ApplicationRole> roleManager, SignInManager<ApplicationUser> signInManager, IEmailSender emailSender, ISmsSender smsSender, ILoggerFactory loggerFactory) { _userManager = userManager; _roleManager = roleManager; _signInManager = signInManager; _emailSender = emailSender; _smsSender = smsSender; _logger = loggerFactory.CreateLogger<AccountController>(); } } 

EDIT: added ApplicationRole class:

 public class ApplicationUser : IdentityUser { } public class ApplicationDbContext : IdentityDatabaseContext<ApplicationUser, ApplicationRole, string> { } public class ApplicationRole : IdentityRole { } 

Any ideas how to do this? Thanks!!

+5
source share
1 answer

You specify IdentityRole instead of ApplicationRole when you call services.AddIdentity<ApplicationUser, IdentityRole>() , which registers the RoleManager<IdentityRole> , but not the RoleManager<ApplicationRole> , which your account controller uses.

Replace IdentityRole with ApplicationRole in your ConfigureServices method and it should work:

 services.AddIdentity<ApplicationUser, ApplicationRole>() .AddMongoDBIdentityStores<ApplicationDbContext, ApplicationUser, ApplicationRole, string>(); 
+8
source

Source: https://habr.com/ru/post/1237561/


All Articles