Há muito pouca documentação sobre o uso do novo Asp.net Identity Security Framework.
Reuni o que pude para tentar criar uma nova função e adicionar um usuário a ela. Tentei o seguinte: Adicionar função na identidade do ASP.NET
que parece que pode ter obtido as informações deste blog: construir um aplicativo de tarefas simples com identidade asp.net e associar usuários a tarefas
Eu adicionei o código a um Inicializador de banco de dados que é executado sempre que o modelo muda. Ele falha na RoleExists
função com o seguinte erro:
System.InvalidOperationException
ocorreu em mscorlib.dll O tipo de entidade IdentityRole não faz parte do modelo para o contexto atual.
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));
}
}
Qualquer ajuda é apreciada.
fonte
Aqui vamos nós:
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); }
fonte
IdentityDbContext
e outra que estava usando um contexto personalizado, então, quando usei sua sugestãoAppilcationDbContext()
, funcionou.Aqui está o artigo completo que descreve como criar funções, modificar funções, excluir funções e gerenciar funções usando a identidade ASP.NET. Isso também contém interface de usuário, métodos de controlador, etc.
http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc
Espero que esta ajuda
obrigado
fonte
Em
ASP.NET 5 rc1-final
, eu fiz o seguinte:Criado
ApplicationRoleManager
(da mesma forma que éApplicationUser
criado pelo modelo)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) { } }
Para
ConfigureServices
inStartup.cs
, eu o adicionei como RoleManagerPara criar novas funções, ligue a partir de
Configure
: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(); ... }
Agora, as regras podem ser atribuídas ao usuário
await _userManager.AddToRoleAsync(await _userManager.FindByIdAsync(User.GetUserId()), "Developer");
Ou usado em
Authorize
atributo[Authorize(Roles = "Developer")] public class DeveloperController : Controller { }
fonte
services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>()
Não consegui adicionarservices
diretamente.Como uma melhoria no código Peters acima, você pode usar isto:
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); if (!roleManager.RoleExists("Member")) roleManager.Create(new IdentityRole("Member"));
fonte
Meu aplicativo estava travando na inicialização quando usei os exemplos de código de Peter Stulinski e Dave Gordon com EF 6.0. Eu mudei:
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
para
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(**context**));
O que faz sentido quando no método seed você não deseja instanciar outra instância do
ApplicationDBContext
. Isso pode ter sido agravado pelo fato de que eu tinhaDatabase.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
no construtor deApplicationDbContext
fonte
Modelo de visualização de funções
public class RoleViewModel { public string Id { get; set; } [Required(AllowEmptyStrings = false)] [Display(Name = "RoleName")] public string Name { get; set; } }
Método de controle
[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(); }
fonte
Eu queria compartilhar outra solução para adicionar funções:
<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" /> }
Controlador:
[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(); }
fonte
Se você estiver usando o modelo padrão criado quando você seleciona um novo aplicativo da Web ASP.net e seleciona Contas de usuário individual como Autenticação e tenta criar usuários com funções, aqui está a solução. No método de registro do controlador de conta que é chamado usando [HttpPost], adicione as seguintes linhas em
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"); }
Isso criará, primeiro, criará uma função em seu banco de dados e, em seguida, adicionará o usuário recém-criado a esta função.
fonte
public static void createUserRole(string roleName) { if (!System.Web.Security.Roles.RoleExists(roleName)) { System.Web.Security.Roles.CreateRole(roleName); } }
fonte
o método que eu uso para criar funções está abaixo, atribuindo-as a usuários no código também está listado. o código abaixo está em "configuration.cs" na pasta de migrações.
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();
fonte