2016-03-23 24 views
14

Sto provando a configurare la mia autenticazione e autorizzazione usando il mio database e le tabelle esistenti, senza usare Entity Framework (usando Dapper).Autenticazione e autorizzazione senza Entity Framework in ASP.NET 5 MVC 6

Ho il Dapper configurato correttamente, ora sto cercando di collegare SignInManager e UserManager per chiamare il mio database tramite Dapper, ma prima che ciò possa accadere, sto riscontrando degli errori con il mio ruolo personalizzato negozio.

Ecco l'errore che sto ricevendo quando fa clic sul pulsante "Registra" sul sito web (questo è solo un progetto semplice con tutto il conto predefinito ecc roba fuori dalla scatola)

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNet.Identity.IRoleStore`1[TestAsyncWebsite.Configuration.WrestleStatRole]' while attempting to activate 'Microsoft.AspNet.Identity.RoleManager`1[TestAsyncWebsite.Configuration.WrestleStatRole]' 

Per ora, ecco come ho configurato il mio utente personalizzata, ruolo, UserStore, negozio di ruolo, usermanager, e roleManager:

public class WrestleStatUser : ApplicationUser 
    { 
     public WrestleStatUser() : base() 
     { 

     } 
    } 

    public class WrestleStatRole : IdentityRole 
    { 

    } 

public class WrestleStatUserStore : IUserStore<WrestleStatUser> 
{ 
    // all methods implemented 
} 

public class WrestleStatRoleStore : IRoleStore<WrestleStatRole> 
{ 
    // all methods implemented 
} 

    public class WrestleStatUserManager : UserManager<WrestleStatUser> 
    { 
     public WrestleStatUserManager(IUserStore<WrestleStatUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<WrestleStatUser> passwordHasher, IEnumerable<IUserValidator<WrestleStatUser>> userValidators, IEnumerable<IPasswordValidator<WrestleStatUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IEnumerable<IUserTokenProvider<WrestleStatUser>> tokenProviders, ILogger<UserManager<WrestleStatUser>> logger, IHttpContextAccessor contextAccessor) 
      : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, tokenProviders, logger, contextAccessor) 
     { 
     } 
    } 

public class WrestleStatRoleManager : RoleManager<WrestleStatRole> 
{ 
    public WrestleStatRoleManager(IRoleStore<WrestleStatRole> store, IEnumerable<IRoleValidator<WrestleStatRole>> roleValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, ILogger<RoleManager<WrestleStatRole>> logger, IHttpContextAccessor contextAccessor) : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor) 
    { 
    } 
} 

ed ecco il mio startup.cs:

services.AddIdentity<WrestleStatUser, WrestleStatRole>() 
     .AddUserStore<WrestleStatUserStore>() 
     .AddUserManager<WrestleStatUserManager>() 
     //.AddRoleStore<RoleStore>() 
     .AddRoleManager<WrestleStatRoleManager>() 
     .AddDefaultTokenProviders(); 

Cosa mi manca qui? L'errore dice qualcosa sul RoleManager, ho già definito il mio RoleManager personalizzato ...

risposta

11

un problema che vedo è il tuo WrestleStatRole eredita da IdentityRole che può sembrare parte di Identity ma è davvero parte dell'implementazione Identità di EntityFramework, se stai provando a fare cose senza EF non dovresti ereditare da quello.

Avresti bisogno della tua classe di ruolo e non dovresti utilizzare alcuna classe dall'implementazione EF.

Allo stesso modo l'ApplicationUser che si eredita dalla in WrestleStatUser è nella cartella modelli di Project Web App, ma assicurarsi che non eredita da IdentityUser che fa parte dell'attuazione EntityFramework dell'identità

Per non utilizzare Entity Framework è necessario implementare IUserStore e IRoleStore e registrare quelli con di servizi

services.AddScoped<IUserStore<WrestleStatUser>, UserStore<WrestleStatUser>>(); 
services.AddScoped<IRoleStore<WrestleStatRole>, RoleStore<WrestleStatRole>>(); 

e come accennato l'utente e le classi di ruolo non dovrebbe ereditare da implementazioni EF, in realtà non hanno bisogno di ereditare da qualsiasi cosa, purché si hanno implementato quei negozi a d funzionano

È possibile utilizzare UserManager integrato se si implementa il programma di gestione degli utenti e del roster, non è necessario implementarlo personalmente, a meno che non si abbiano altri motivi per farlo.

Se è necessario un codice di esempio, è possibile consultare il mio cloudscribe project Ho implementato un'implementazione di identità multi-tenant personalizzata che non utilizza il framework di entità. In realtà sto supportando più livelli di dati che possono essere inseriti e EF è uno di questi, ma è asportato lontano dai bit di identità e non sto utilizzando nulla dallo spazio dei nomi Microsoft.AspNetCore.Identity.EntityFrameworkCore.