2013-10-31 20 views
72

Istnieje bardzo mało dokumentacji na temat korzystania z nowego Asp.net Identity Security Framework.Tworzenie ról w Asp.net Tożsamość MVC 5

Połączyłem wszystko, co mogłem, aby spróbować utworzyć nową rolę i dodać do niej użytkownika. Próbowałem następujące: Add role in ASP.NET Identity

który wygląda jak może zdobyć info z tego bloga: building a simple to-do application with asp.net identity and associating users with to-does

Dodałem kod do Initializer bazy danych, który jest uruchamiany ilekroć modelowych zmian. To nie na funkcji RoleExists z następującym błędem:

System.InvalidOperationException occurred in mscorlib.dll The entity type IdentityRole is not part of the model for the current context.

protected override void Seed (MyContext context) 
{ 
    var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 
    var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 

    // Create Admin Role 
    string roleName = "Admins"; 
    IdentityResult roleResult; 

    // Check to see if Role Exists, if not create it 
    if (!RoleManager.RoleExists(roleName)) 
    { 
     roleResult = RoleManager.Create(new IdentityRole(roleName)); 
    } 
} 

Każda pomoc jest mile widziana.

Odpowiedz

19

Sprawdź, czy masz po podpisaniu swojej klasie MyContext

public class MyContext : IdentityDbContext<MyUser>

Albo

public class MyContext : IdentityDbContext

kod działa dla mnie, bez żadnych modyfikacji !!!

+4

Dziękuję wszystkim za odpowiedzi. Teraz wszystko działa. Sprawdzanie kontekstu doprowadziło mnie we właściwym kierunku. Po utworzeniu tożsamości asp.net tworzy nowy kontekst (ApplicationDbContext), który rozszerza IdentityDbContext. W moim kodzie odwoływałam się do mojego pierwotnego kontekstu, który nie rozszerzył IdentityDbContext. Jeśli ktoś inny ma ten problem, sprawdź konteksty i dwukrotnie sprawdź katalog APP_DATA, aby upewnić się, że przypadkowo nie tworzysz dwóch baz danych. – colbyJax

64

Zaczynamy:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); 


    if(!roleManager.RoleExists("ROLE NAME")) 
    { 
     var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole(); 
     role.Name = "ROLE NAME"; 
     roleManager.Create(role); 

    } 
+2

To mi pomogło, tym bardziej, że nie używałem Migracji. Używam DropCreateDatabaseAlways. – Ciwan

+0

Mój problem polegał na tym, że korzystałem z niewłaściwego kontekstu. Stworzyłem dwa ciągi połączenia, jeden o nazwie "IdentityDbContext" i inny, w którym używałem niestandardowego kontekstu, więc gdy użyłem twojej sugestii 'AppilcationDbContext()', zadziałało. – megamaiku

7

Jako poprawy na kodzie Peters powyżej można użyć to:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); 

    if (!roleManager.RoleExists("Member")) 
      roleManager.Create(new IdentityRole("Member")); 
21

Oto pełna artykuł opisujący jak stworzyć rolę, modyfikować role, usuwać role i zarządzanie rolami za pomocą tożsamości ASP.NET. Zawiera również interfejs użytkownika, metody kontrolera itp

http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc

Nadzieja to helpls

Dzięki

+1

Twój blog jest ładny, ale nieaktualny, możesz zaktualizować kontroler konta – aggie

+0

Jest już dla ASP.NET MVC 5 (jakiej aktualizacji szukasz aggie?). Możesz pobrać kod źródłowy z linku GitHub określonego w tym artykule. –

+1

Niektóre z tych funkcji wydają się przestarzałe od wersji 2.2.0. 1) czy mogę użyć tego samego kodu w aktualnej wersji 2) Jak mogę zmienić klucz podstawowy z Guid na e-mail 3) wszelkie zalecenia dotyczące integracji recpatcha z tożsamością będą mile widziane http://j.mp/1nohaHe – aggie

0

Chciałem podzielić się inne rozwiązanie do dodawania ról:

<h2>Create Role</h2> 

@using (Html.BeginForm()) 
{ 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 
<span class="label label-primary">Role name:</span> 
<p> 
    @Html.TextBox("RoleName", null, new { @class = "form-control input-lg" }) 
</p> 
<input type="submit" value="Save" class="btn btn-primary" /> 
} 

Controller:

[HttpGet] 
    public ActionResult AdminView() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult AdminView(FormCollection collection) 
    { 
     var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); 

     if (roleManager.RoleExists(collection["RoleName"]) == false) 
     { 
      Guid guid = Guid.NewGuid(); 
      roleManager.Create(new IdentityRole() { Id = guid.ToString(), Name = collection["RoleName"] }); 
     } 
     return View(); 
    } 
3

Moja aplikacja zawieszała się przy starcie, gdy używałam Petera Stulińskiego & Próbki kodu Dave Gordona z EF 6.0. Zmieniłem:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); 

do

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(**context**)); 

Który ma sens, gdy w metodzie nasion nie chcesz instancję inną instancję ApplicationDBContext.To może być potęgowane przez fakt, że miałem Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer()); w konstruktorze ApplicationDbContext

+0

To jest poprawiono, że przenieśli się do RoleStore w EF 6 –

2

Roles Widok Model

public class RoleViewModel 
{ 
    public string Id { get; set; } 
    [Required(AllowEmptyStrings = false)] 
    [Display(Name = "RoleName")] 
    public string Name { get; set; } 
} 

metody Controller

[HttpPost] 
    public async Task<ActionResult> Create(RoleViewModel roleViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      var role = new IdentityRole(roleViewModel.Name); 
      var roleresult = await RoleManager.CreateAsync(role); 
      if (!roleresult.Succeeded) 
      { 
       ModelState.AddModelError("", roleresult.Errors.First()); 
       return View(); 
      } 
      return RedirectToAction("some_action"); 
     } 
     return View(); 
    } 
14

W ASP.NET 5 rc1-final, ja następujący:

Utworzono ApplicationRoleManager (w podobny sposób, jak jest ApplicationUser c reated przez szablon)

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

Do ConfigureServices w Startup.cs, dodałem go jako RoleManager

services. 
    .AddIdentity<ApplicationUser, IdentityRole>() 
    .AddRoleManager<ApplicationRoleManager>(); 

Do tworzenia nowych ról, zadzwoń od Configure następujący:

public static class RoleHelper 
{ 
    private static async Task EnsureRoleCreated(RoleManager<IdentityRole> roleManager, string roleName) 
    { 
     if (!await roleManager.RoleExistsAsync(roleName)) 
     { 
      await roleManager.CreateAsync(new IdentityRole(roleName)); 
     } 
    } 
    public static async Task EnsureRolesCreated(this RoleManager<IdentityRole> roleManager) 
    { 
     // add all roles, that should be in database, here 
     await EnsureRoleCreated(roleManager, "Developer"); 
    } 
} 

public async void Configure(..., RoleManager<IdentityRole> roleManager, ...) 
{ 
    ... 
    await roleManager.EnsureRolesCreated(); 
    ... 
} 

Teraz reguły mogą być przypisany do użytkownika

await _userManager.AddToRoleAsync(await _userManager.FindByIdAsync(User.GetUserId()), "Developer"); 

lub wykorzystywane w Authorize atrybutu

[Authorize(Roles = "Developer")] 
public class DeveloperController : Controller 
{ 
} 
+1

To jest fenomenalne! Dziękuję za aktualizację. –

+0

'services.AddIdentity (). AddRoleManager ()' Nie byłem w stanie dodać go bezpośrednio do 'usług'. –

+2

@AlexC, Przepraszam, moje złe. Starałem się, aby było to tak proste, jak to tylko możliwe, i usunąłem AddIdentity. Naprawiony. – nothrow

0
public static void createUserRole(string roleName) 
    { 
     if (!System.Web.Security.Roles.RoleExists(roleName)) 
     { 
      System.Web.Security.Roles.CreateRole(roleName); 
     } 
    } 
0

zastosowano metodę używać do tworzenia ról jest poniżej, przypisując je do użytkowników w kodzie jest również wymieniona. poniższy kod znajduje się w folderze "configuration.cs" w folderze migracji.

string [] roleNames = { "role1", "role2", "role3" }; 
var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 

       IdentityResult roleResult; 
       foreach(var roleName in roleNames) 
       { 
        if(!RoleManager.RoleExists(roleName)) 
        { 
         roleResult = RoleManager.Create(new IdentityRole(roleName)); 
        } 
       } 
       var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 
       UserManager.AddToRole("user", "role1"); 
       UserManager.AddToRole("user", "role2"); 
       context.SaveChanges(); 
Powiązane problemy