I'm trying to pass to my controller the RoleManager like UserManager, but I have this error:
An unhandled exception occurred while processing the request.
InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNet.Identity.RoleManager`1[Web.MongoDBIdentitySample.Models.ApplicationRole]' while attempting 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 my ApplicationRole class:
public class ApplicationUser : IdentityUser
{
}
public class ApplicationDbContext : IdentityDatabaseContext<ApplicationUser, ApplicationRole, string>
{
}
public class ApplicationRole : IdentityRole
{
}
Any ideas how to inject this? Thanks!!
ASP.NET Core supports the dependency injection (DI) software design pattern, which is a technique for achieving Inversion of Control (IoC) between classes and their dependencies.
Dependency Injection is the design pattern that helps us to create an application which loosely coupled. This means that objects should only have those dependencies that are required to complete tasks.
Dependency injection in . NET is a built-in part of the framework, along with configuration, logging, and the options pattern. A dependency is an object that another object depends on. Examine the following MessageWriter class with a Write method that other classes depend on: C# Copy.
You're specifying IdentityRole
instead of ApplicationRole
when calling services.AddIdentity<ApplicationUser, IdentityRole>()
, which registers RoleManager<IdentityRole>
but not the RoleManager<ApplicationRole>
your account controller is using.
Replace IdentityRole
by ApplicationRole
in your ConfigureServices
method and it should work:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddMongoDBIdentityStores<ApplicationDbContext, ApplicationUser, ApplicationRole, string>();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With