我正在构建一个本质上是商店的网络应用程序,但我想为网站管理员提供一种简单的方法来添加新产品。但是我想限制网站的这一部分,以便只有管理员可以访问它。我现在对其他用户没有用。
如何才能让任何拥有管理员用户名和密码的人都可以访问这些页面,并且会一直知道他们已登录?我已经有一个系统可以接受用户输入,如果输入正确则继续进入管理页面。但问题是,如果有人决定直接进入 Admin/AddProduct 等页面。我需要我的应用知道他们还不允许访问 AddProduct 页面并将他们重定向回登录页面。
最佳答案
乔伊,这是你的做法
您可以通过在 startup
类中创建一个 CreateRoles
方法轻松地做到这一点。这有助于检查角色是否已创建,如果没有则创建角色;在应用程序启动时。就像这样。
private async Task CreateRoles(IServiceProvider serviceProvider)
{
//initializing custom roles
var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
string[] roleNames = { "Admin", "Store-Manager", "Member" };
IdentityResult roleResult;
foreach (var roleName in roleNames)
{
var roleExist = await RoleManager.RoleExistsAsync(roleName);
// ensure that the role does not exist
if (!roleExist)
{
//create the roles and seed them to the database:
roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
}
}
// find the user with the admin email
var _user = await UserManager.FindByEmailAsync("admin@email.com");
// check if the user exists
if(_user == null)
{
//Here you could create the super admin who will maintain the web app
var poweruser = new ApplicationUser
{
UserName = "Admin",
Email = "admin@email.com",
};
string adminPassword = "p@$$w0rd";
var createPowerUser = await UserManager.CreateAsync(poweruser, adminPassword);
if (createPowerUser.Succeeded)
{
//here we tie the new user to the role
await UserManager.AddToRoleAsync(poweruser, "Admin");
}
}
}
然后您可以从 Startup 类的 Configure
方法调用 await CreateRoles(serviceProvider);
方法。
确保将 IServiceProvider
作为 Configure
类中的参数。
问题 2:“如何才能让任何拥有管理员用户名和密码的人都可以访问这些页面”
您可以像这样轻松地做到这一点。
[Authorize(Roles="Admin")]
public class ManageController : Controller
{
//....
Return View();
}
您也可以像这样在操作方法中使用基于角色的授权。如果愿意,分配多个角色
[Authorize(Roles="Admin")]
public IActionResult Index()
{
/*
.....
*/
}
虽然这工作正常,但为了更好的实践,您可能需要阅读有关使用基于策略的角色检查的信息。您可以在 ASP.NET 核心文档中找到它 here ,或者我写的这篇文章here
关于c# - 如何为 MVC .Net Core 应用创建单个管理员用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43731437/