Istnieje bardzo niewiele dokumentacji na temat korzystania z nowej platformy zabezpieczeń tożsamości Asp.net Identity Security.
Zebrałem wszystko, co mogłem, aby spróbować stworzyć nową rolę i dodać do niej użytkownika. Próbowałem wykonać następujące czynności: Dodaj rolę w ASP.NET Identity
który wygląda na to, że mógł uzyskać informacje z tego bloga: tworzenie prostej aplikacji do wykonania z tożsamością asp.net i kojarzenie użytkowników z zadaniami do wykonania
Dodałem kod do inicjatora bazy danych, który jest uruchamiany po każdej zmianie modelu. RoleExists
Funkcja kończy się niepowodzeniem z następującym błędem:
System.InvalidOperationException
wystąpiło w mscorlib.dll Typ jednostki IdentityRole nie jest częścią modelu dla bieżącego kontekstu.
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.
źródło
No to ruszamy:
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); }
źródło
IdentityDbContext
a drugi użyłem niestandardowego kontekstu, więc kiedy skorzystałem z twojej sugestiiAppilcationDbContext()
, zadziałało.Oto pełny artykuł opisujący tworzenie ról, modyfikowanie ról, usuwanie ról i zarządzanie rolami przy użyciu ASP.NET Identity. Zawiera również interfejs użytkownika, metody kontrolera itp.
http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc
Mam nadzieję, że to pomoże
Dzięki
źródło
W
ASP.NET 5 rc1-final
, wykonałem następujące czynności:Utworzono
ApplicationRoleManager
(podobnie jak jest toApplicationUser
tworzone 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) { } }
Aby
ConfigureServices
INStartup.cs
, dodałem go jako RoleManagerAby utworzyć nowe role, zadzwoń z
Configure
następujących: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 można przypisać do użytkownika
await _userManager.AddToRoleAsync(await _userManager.FindByIdAsync(User.GetUserId()), "Developer");
Lub używany w
Authorize
atrybucie[Authorize(Roles = "Developer")] public class DeveloperController : Controller { }
źródło
services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>()
Nie udało mi się dodać tegoservices
bezpośrednio do .Jako ulepszenie powyższego kodu Peters możesz użyć tego:
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); if (!roleManager.RoleExists("Member")) roleManager.Create(new IdentityRole("Member"));
źródło
Moja aplikacja zawieszała się na starcie, kiedy korzystałem z próbek kodu Petera Stulińskiego i Dave'a Gordona z EF 6.0. Zmieniłam:
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**));
Ma to sens, gdy w metodzie początkowej nie chcesz tworzyć instancji kolejnej instancji
ApplicationDBContext
. Mogło to być spotęgowane przez fakt, że miałemDatabase.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
w konstruktorzeApplicationDbContext
źródło
Role Zobacz model
public class RoleViewModel { public string Id { get; set; } [Required(AllowEmptyStrings = false)] [Display(Name = "RoleName")] public string Name { get; set; } }
Metoda kontrolera
[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(); }
źródło
Chciałem udostępnić 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" /> }
Kontroler:
[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(); }
źródło
Jeśli używasz domyślnego szablonu, który jest tworzony po wybraniu nowej aplikacji sieci Web ASP.net i wybraniu indywidualnych kont użytkowników jako uwierzytelniania i próbie utworzenia użytkowników z rolami, oto rozwiązanie. W metodzie Rejestr kontrolera konta, która jest wywoływana przy użyciu [HttpPost], dodaj następujące wiersze w
if condition
.var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext()); var roleManager = new RoleManager<IdentityRole>(roleStore); if(!await roleManager.RoleExistsAsync("YourRoleName")) await roleManager.CreateAsync(new IdentityRole("YourRoleName")); await UserManager.AddToRoleAsync(user.Id, "YourRoleName"); await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); return RedirectToAction("Index", "Home"); }
Spowoduje to utworzenie najpierw roli w bazie danych, a następnie dodania nowo utworzonego użytkownika do tej roli.
źródło
public static void createUserRole(string roleName) { if (!System.Web.Security.Roles.RoleExists(roleName)) { System.Web.Security.Roles.CreateRole(roleName); } }
źródło
metoda, której używam do tworzenia ról, znajduje się poniżej, podano również przypisywanie ich do użytkowników w kodzie. poniższy kod znajduje się w pliku „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();
źródło