2014-10-03 13 views
12

Ho modificato la chiave primaria per il database utente da stringa a int utilizzando il tutorial here, ma ho difficoltà a inizializzare il Gestore ruoli. Inizialmente è stato inizializzato utilizzandoInizializzazione di RoleManager in identità ASP.NET con ruoli personalizzati

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 

Come posso creare il gestore ruolo utilizzando i nuovi dati?

Aggiornamento: sto usando MVC 5 e 6. EF

+0

esatta stesso problema che sto avendo, se uso '[Autorizza (ruoli = "Admin")]' ottengo il seguente errore: 'La bandiera di accesso istanza utente non è supportato in questa versione di SQL Server . La connessione verrà chiusa' – Zapnologica

risposta

23

tuo ApplicationRoleManager può assomigliare a questo. perché devi ereditare dalla tua classe customRole invece di IdentityRole.

public class ApplicationRoleManager : RoleManager<CustomRole, int> 
{ 
    public ApplicationRoleManager(IRoleStore<CustomRole, int> roleStore) 
     : base(roleStore) 
    { 
    } 

    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context) 
    { 
     return new ApplicationRoleManager(new RoleStore<CustomRole, int, CustomUserRole>(context.Get<ApplicationDbContext>())); 
    } 
} 

Quindi aggiungere il seguente codice alla classe Startup.Auth.cs se non esiste attualmente.

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 

Quindi si creano e gestiscono ruoli.

var roleManager = HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); 

    const string roleName = "Admin"; 

    //Create Role Admin if it does not exist 
    var role = roleManager.FindByName(roleName); 
    if (role == null) 
    { 
     role = new CustomRole(); 
     role.Id = 1; // this will be integer 
     role.Name = roleName; 

     var roleresult = roleManager.Create(role); 
    } 

Spero che questo aiuti.

+1

per qualche motivo la linea è startup.auth.cs mancava su un progetto e il manager dei ruoli non stava inizializzando, questo ha risolto il mio problema grazie – Jay

+0

Will '[Authorize (Roles =" Edit ")]' Funziona automaticamente dopo questo? – Zapnologica

+0

Dovrebbe funzionare come previsto, nessuna differenza tra l'inserimento manuale dei ruoli direttamente nel database .. – DSR

3

Dalla tua domanda non posso determinare se si sta utilizzando le stesse strutture (MVC & EF).

Recentemente ho creato una soluzione MVC + EF utilizzando ApplicationUser personalizzati & IdentityRoles. ApplicationUser deriva da "Microsoft.AspNet.Identity.EntityFramework.IdentityUser". ApplicationRoles sono implementati senza modifiche.

Ho la seguente classe:

// Configure the used in the application. RoleManager is defined in the ASP.NET Identity core assembly 
    public class ApplicationRoleManager : RoleManager<IdentityRole> 
    { 
     public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore) 
      : base(roleStore) 
     { 
     } 

     public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context) 
     { 
      return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>())); 
     } 
    } 

entro configuration.cs (migrazioni) ==> su 'update-database' questo verrà eseguito

var roleStore = new RoleStore<IdentityRole>(context); 
    var roleManager = new RoleManager<IdentityRole>(roleStore); 
    var applicationRoleAdministrator = new IdentityRole("Administrator"); 
    if (!roleManager.RoleExists(applicationRoleAdministrator.Name)) 
    { 
     roleManager.Create(applicationRoleAdministrator); 
    } 
// do some logic to find your applicationUserAdministrator 
var applicationUserAdministrator = userManager.FindByName("Administrator"); 
userManager.AddToRole(applicationUserAdministrator.Id, applicationRoleAdministrator.Name); 

startup.auth.cs withing il collegamento verso il RoleManager:

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 
+0

Beh, sto utilizzando MVC 5 e EF 6. Se segui il tutorial, crea classi personalizzate per IdentityRole, UserStore e RoleStore. Il compilatore non mi ha permesso di usarlo. 'nuovo RoleStore (contesto);' – lhhc

+1

Controlla la mia risposta sopra. – DSR

1

Spero che questo aiuti.

var roleManager = new RoleManager<CustomRole,int>(new RoleStore<CustomRole,int,CustomUserRole>(context)); 
    var UserManager = new UserManager<ApplicationUser,int>(new UserStore<ApplicationUser,CustomRole,int,CustomUserLogin,CustomUserRole,CustomUserClaim>(context)); 

    // In Startup iam creating first Admin Role and creating a default Admin User  
    if (!roleManager.RoleExists("Admin")){ 
    //first we create Admin rool 
     var role = new CustomRole(); 
     role.Name = "Admin"; 
     roleManager.Create(role); 
    } 

    ////Here we create a Admin super user who will maintain the website  
    if (UserManager.FindByName("Admin") == null){ 
     var user = new ApplicationUser() { UserName = "Admin" }; 
     string userPWD = "adminadmin"; 
     var chkUser = UserManager.Create(user, userPWD); 
     if (chkUser.Succeeded){ 
      var result1 = UserManager.AddToRole(user.Id, "Admin") 
      ; 
     } 
    } 
Problemi correlati