Nuestro grupo redactor ha estado horas buscando la solución a tus dudas, te ofrecemos la solución por eso nuestro deseo es serte de gran ayuda.
Solución:
Mi comentario fue eliminado porque proporcioné un enlace a una pregunta similar que respondí aquí. Ergo, la responderé de manera más descriptiva esta vez. Aquí va.
Puede hacer esto fácilmente creando un CreateRoles
método en tu startup
clase. Esto ayuda a verificar si se crean los roles y crea los roles si no lo son; en el inicio de la aplicación. Al igual que.
private async Task CreateRoles(IServiceProvider serviceProvider)
//initializing custom roles
var RoleManager = serviceProvider.GetRequiredService>();
var UserManager = serviceProvider.GetRequiredService>();
string[] roleNames = "Admin", "Manager", "Member" ;
IdentityResult roleResult;
foreach (var roleName in roleNames)
var roleExist = await RoleManager.RoleExistsAsync(roleName);
if (!roleExist)
//create the roles and seed them to the database: Question 1
roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
//Here you could create a super user who will maintain the web app
var poweruser = new ApplicationUser
UserName = Configuration["AppSettings:UserName"],
Email = Configuration["AppSettings:UserEmail"],
;
//Ensure you have these values in your appsettings.json file
string userPWD = Configuration["AppSettings:UserPassword"];
var _user = await UserManager.FindByEmailAsync(Configuration["AppSettings:AdminUserEmail"]);
if(_user == null)
var createPowerUser = await UserManager.CreateAsync(poweruser, userPWD);
if (createPowerUser.Succeeded)
//here we tie the new user to the role
await UserManager.AddToRoleAsync(poweruser, "Admin");
y luego podrías llamar al CreateRoles(serviceProvider).Wait();
método del Configure
en la clase Startup. asegúrate de tener IServiceProvider
como parámetro en el Configure
clase.
Uso de la autorización basada en roles en un controlador para filtrar el acceso de los usuarios: Pregunta 2
Puedes hacer esto fácilmente, así.
[Authorize(Roles="Manager")]
public class ManageController : Controller
//....
También puede utilizar la autorización basada en roles en el método de acción como tal. Asigne múltiples roles, si lo desea
[Authorize(Roles="Admin, Manager")]
public IActionResult Index()
/*
.....
*/
Si bien esto funciona bien, para una práctica mucho mejor, es posible que desee leer sobre el uso de comprobaciones de roles basadas en políticas. Puede encontrarlo en la documentación principal de ASP.NET aquí, o en este artículo que escribí al respecto aquí
He creado una acción en el Accounts
controlador que llama a una función para crear los roles y asignar el Admin
rol para el usuario predeterminado. (Probablemente debería eliminar el usuario predeterminado en producción):
private async Task CreateRolesandUsers()
bool x = await _roleManager.RoleExistsAsync("Admin");
if (!x)
// first we create Admin rool
var role = new IdentityRole();
role.Name = "Admin";
await _roleManager.CreateAsync(role);
//Here we create a Admin super user who will maintain the website
var user = new ApplicationUser();
user.UserName = "default";
user.Email = "[email protected]";
string userPWD = "somepassword";
IdentityResult chkUser = await _userManager.CreateAsync(user, userPWD);
//Add default User to Role Admin
if (chkUser.Succeeded)
var result1 = await _userManager.AddToRoleAsync(user, "Admin");
// creating Creating Manager role
x = await _roleManager.RoleExistsAsync("Manager");
if (!x)
var role = new IdentityRole();
role.Name = "Manager";
await _roleManager.CreateAsync(role);
// creating Creating Employee role
x = await _roleManager.RoleExistsAsync("Employee");
if (!x)
var role = new IdentityRole();
role.Name = "Employee";
await _roleManager.CreateAsync(role);
Después, podría crear un controlador para administrar roles para los usuarios.
La respuesta de Temi es casi correcta, pero no se puede llamar a una función asincrónica desde una función no asincrónica como sugiere. Lo que debe hacer es realizar llamadas asincrónicas en una función sincrónica como esta:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
app.UseBrowserLink();
else
app.UseExceptionHandler("/Home/Error");
app.UseStaticFiles();
app.UseIdentity();
// Add external authentication middleware below. To configure them please see https://go.microsoft.com/fwlink/?LinkID=532715
app.UseMvc(routes =>
routes.MapRoute(
name: "default",
template: "controller=Home/action=Index/id?");
);
CreateRoles(serviceProvider);
private void CreateRoles(IServiceProvider serviceProvider)
var roleManager = serviceProvider.GetRequiredService>();
var userManager = serviceProvider.GetRequiredService>();
Task roleResult;
string email = "[email protected]";
//Check that there is an Administrator role and create if not
Task hasAdminRole = roleManager.RoleExistsAsync("Administrator");
hasAdminRole.Wait();
if (!hasAdminRole.Result)
roleResult = roleManager.CreateAsync(new IdentityRole("Administrator"));
roleResult.Wait();
//Check if the admin user exists and create it if not
//Add to the Administrator role
Task testUser = userManager.FindByEmailAsync(email);
testUser.Wait();
if (testUser.Result == null)
ApplicationUser administrator = new ApplicationUser();
administrator.Email = email;
administrator.UserName = email;
Task newUser = userManager.CreateAsync(administrator, "[email protected]!");
newUser.Wait();
if (newUser.Result.Succeeded)
Task newUserRole = userManager.AddToRoleAsync(administrator, "Administrator");
newUserRole.Wait();
los key a esto está el uso de la clase Task <> y obligar al sistema a esperar de una manera ligeramente diferente de forma sincrónica.
Te invitamos a añadir valor a nuestro contenido informacional tributando tu veteranía en las reseñas.