tables - Agregar rol en Identidad ASP.NET
asp.net membership vs identity (4)
Comenzando con .NET Framework 4.5, Windows Identity Foundation (WIF) se ha integrado completamente en .NET Framework.
Aconsejaría examinar la posibilidad, en mi opinión la preferida, de implementar Autorización a través de Reclamaciones ( Expresando Roles como Reclamos ).
Cuando se llama al método IsInRole (), se realiza una comprobación para ver si el usuario actual tiene ese rol. En las aplicaciones para notificaciones, el rol se expresa mediante un tipo de notificación de función que debería estar disponible en el token.
El tipo de notificación de función se expresa utilizando el siguiente URI: " http://schemas.microsoft.com/ws/2008/06/identity/claims/role "
Entonces desde el UserManager puedes hacer algo como esto (sin el RoleManager):
var um = new UserManager();
um.AddClaimAsync(1, new Claim(ClaimTypes.Role, "administrator"));
Las reclamaciones pueden simplificar e incrementar el rendimiento de los procesos de autenticación y autorización. Puede usar los roles almacenados como reclamos para eliminar consultas de back-end cada vez que se produce una autorización.
Al usar las Reclamaciones ya no necesitará la Tienda de Roles (al menos para las autorizaciones equivalentes ...)
¿Cómo puedo agregar un Rol en el nuevo sistema de Identidad ASP.NET (1.0)? Hay una clase de UserStore
pero ninguna clase de RoleStore
.
No puedo encontrar ninguna documentación sobre este tema.
La identidad de ASP.NET es consciente de las reclamaciones con respecto a los roles. Eso realmente me confundió porque en el sistema anterior configuraste miembros y proveedores de roles en web.config.
El problema para mí es que tengo un código como este:
HttpContext.Current.User.IsInRole("some role")
Afortunadamente, esta lógica todavía funciona. Puede ver la lógica en la función CreateAsync en ClaimsIdentityFactory.cs que se encuentra en Microsoft.AspNet.Identity.Core
. Uno de los argumentos es UserManager
. Le pregunta si SupportsUserRole
GetRolesAsync
y, en ese caso, llama a GetRolesAsync
y agrega cada función como un reclamo al ClaimIdentity
. No hay necesidad de hacer esto usted mismo.
IsInRole
usa reclamos como se describe aquí:
Utilicé los siguientes fragmentos en una página web de ejemplo de asp.net page_load para comenzar a comprender cómo funciona Identity ASP
UserManager userManager = new UserManager();
var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
var roleManager = new RoleManager<IdentityRole>(roleStore);
var applicationRoleAdministrator = new IdentityRole("superadmin");
if (!roleManager.RoleExists(applicationRoleAdministrator.Name))
{
roleManager.Create(applicationRoleAdministrator);
}
ApplicationUser applicationUserAdministrator = userManager.FindByName(User.Identity.Name);
if (!userManager.GetRoles(applicationUserAdministrator.Id).Contains("superadmin"))
{
Response.Redirect("~/account/login.aspx?ReturnUrl=" + Request.Url.AbsolutePath);
}
Por supuesto, debajo de ApplicationDbContext se genera automáticamente con plantillas de ASP.NET 4.5+ como se muestra a continuación
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
También crea la clase Administrador de roles de la aplicación también
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>()));
return new ApplicationRoleManager(new RoleStore<IdentityRole>(new ApplicationDbContext()));
}
}
también agregue debajo de la línea en su método startup.Auth.cs => ConfigureAuth (aplicación IAppBuilder)
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
Soy nuevo en esta materia de identidad y no estoy seguro de si es necesario o lo estoy haciendo limpio y correcto, pero estos pasos funcionaron para mí
RoleManager = new RoleManager<IdentityRole>(
new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));