6

Sto provando a navigare nel buco nero che è l'implementazione personalizzata di Identity Membership. Il mio obiettivo in questo momento è semplicemente quello di ottenere questa linea dal mio ApiController per recuperare correttamente il mio UserManager:Implementazione personalizzata UserManager personalizzato <IUser> in Identity 2.0

public IHttpActionResult Index() 
{ 
    var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<MyUser,int>>(); 
    //manager is null 
} 

Ecco il mio setup. In Configurazione s' i miei Startup Mi è stata WebAPI e aggiungo la mia OwinContext:

app.CreatePerOwinContext<UserManager<MyUser,int>>(Create); 

il mio metodo Create:

public static UserManager<User,int> Create(IdentityFactoryOptions<UserManager<MyUser,int>> options, IOwinContext context) 
{ 
    return new UserManager<MyUser,int>(new UserStore(new DbContext())); 
} 

il resto è l'implementazione più semplice che posso fare.

MyUser:

public class MyUser : IUser<int> 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
} 

MyUserStore:

public class MyUserStore : IUserStore<MyUser,int> 
{ 
    private IdentityDbContext context; 
    public MyUserStore(IdentityDbContext c) 
    { 
     context = c; 
    } 

    //Create,Delete, etc implementations 
} 

MyDbContext:

public class MyDbContext : IdentityDbContext 
{ 
    public MyDbContext() : base("Conn") 
    { 

    } 
} 

Questo è tutto per il bene di imparare come funziona Identità, che io sono abbastanza convinto no uno sa davvero. Voglio essere in grado di personalizzare completamente i miei utenti e ruoli alla fine, evitando Microsoft IdentityUser.

Ancora una volta, il mio problema adesso è che nel mio controller, sto ricevendo null quando provo a recuperare il mio UserManager.

Qualsiasi aiuto è molto apprezzato.

+0

Un'enorme affermazione su "imparare come funziona l'identità, che sono abbastanza convinto che nessuno lo sappia davvero". Il codice sorgente lo sa. Il codice sorgente è disponibile tramite il decompilatore. – trailmax

+1

Era più un'espressione della mia frustrazione quando non riuscivo a trovare molti esempi – Jonesopolis

risposta

3

Ho avuto parecchi errori, ma il principale era che la mia classe di avvio sembrava:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseWebApi(new WebApiConfig()); 

     app.CreatePerOwinContext(MyDbContext.Create); 
     app.CreatePerOwinContext<MyUserManager>(MyUserManager.Create); 
    } 
} 

Naturalmente, il gasdotto sarà OWIN collegare il mio dipendenze dopo sparando le chiamate WebAPI. Passare in giro era il mio problema principale.

Inoltre, ho finalmente trovato this great guide nella mia ricerca Google. Risponde praticamente a tutto ciò che stavo ottenendo. Avevo bisogno di implementare una classe concreta che fosse un UserManager<MyUser,int>

Spero che questo sia in grado di aiutare qualcuno più tardi.

1

Si sta utilizzando MyIdentity.User o MyIdentity.MyUser? Hai due oggetti diversi passati nel parametro TUser nei tuoi esempi.

Ho testato l'implementazione e non ho riscontrato problemi nel recupero dell'istanza registrata di UserManager.

Per personalizzare completamente i propri utenti e ruoli, è necessario terminare la scrittura di una nuova implementazione di UserManager al fine di far funzionare l'autenticazione, le attestazioni, i ruoli, le chiamate ai metodi e così via.

Se si sta cercando di imparare come funziona Identity, suggerirei di lavorare con l'implementazione predefinita di UserManager e IdentityUser. Fai in modo che funzioni prima.

Here is a good tutorial

Alla fine, creare i propri utenti di attuazione IdentityUser. Tutte le funzioni UserManager funzioneranno e avrai accesso alle tue nuove proprietà. Le proprietà aggiuntive verranno automaticamente integrate nella tabella AspnetUser generata da IdentityDbContext.

public MyIdentityUser : IdentityUser 
{ 
    public int Id {get; set;} 
    public string CustomUserId {get; set;} 
    public string UserId { get; set; } 
} 

o si può iniziare a costruire il vostro MyIdentityUser personalizzato con riferimenti chiave esterna ad altri oggetti.

public MyIdentityUser : IdentityUser 
{ 
    public virtual UserProperties Properties { get; set; } 
} 

Questo è di aiuto?

+0

Grazie Scott. Avevo cambiato le mie lezioni e quando ho modificato la domanda, ho fatto un pessimo lavoro nel mantenere la coerenza. Il mio problema principale ho postato in una risposta me stesso, ma il tuo è molto utile pure. Conoscete in anticipo i vantaggi dell'utilizzo di IdentityUser vs. IUser? – Jonesopolis

+0

IUser è implementato da IdentityUser, che è un contratto per le proprietà Id e UserName. – Scott

+0

(continua) L'oggetto generico TUser che UserManager accetta è richiesto per implementare IUser. Quindi il tuo oggetto MyUser è accettato come tipo di oggetto generico, ma UserManager ha molti altri metodi come "ChangePasswordAsync (utente TUser, password stringa)" che dipendono da quelle proprietà che fanno parte dell'oggetto generico. IdentityUser contiene tali proprietà. L'utilizzo di IdentityUser come classe base per l'oggetto MyUser consente di risparmiare tempo dal doverli dichiarare o ignorare i metodi UserManager per farli funzionare con le proprietà definite dall'utente. – Scott