【问题标题】:How to make a single admin user for MVC .Net Core app如何为 MVC .Net Core 应用程序创建单个管理员用户
【发布时间】:2017-09-29 14:18:57
【问题描述】:

我正在构建一个本质上是一个商店的网络应用程序,但我想为网站管理员提供一种简单的方式来添加新产品。但是我想限制网站的这一部分,以便只有管理员可以访问它。目前我对其他用户没有用处。

如何使任何拥有管理员用户名和密码的人都可以访问这些页面并且它会一直知道他们已登录?我已经有一个接受用户输入的系统,如果它是正确的,然后继续到管理页面。但问题是,如果有人决定直接进入像 Admin/AddProduct 这样的页面。我需要我的应用知道他们还不能访问 AddProduct 页面并将它们重定向回登录。

【问题讨论】:

  • 您需要在登录中添加某种权限系统。对于asp.net,您可以使用asp.net identity framework
  • 对,我已经调查过了,但我不明白如何将我的单个管理员用户添加到它从中提取的任何数据库中。我根本不想有注册用户链接
  • 在启动时,您可以检查您的管理员用户是否存在以及是否创建它。您只需要使用您想要管理员的值调用注册示例中使用的相同方法。
  • 这是否只创建了一个实例。这是一个网络应用程序,所以我担心的是,每次有人访问该网站时,它都不会调用启动并创建一堆相同的管理员用户
  • 可以在创建用户之前检查用户是否存在。

标签: c# asp.net-mvc login asp.net-core


【解决方案1】:

乔伊,这就是你的做法

您可以通过在 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); 方法。 确保在 Configure 类中有 IServiceProvider 作为参数。

问题 2:“如何让任何拥有管理员用户名和密码的人都可以访问这些页面”

你可以很容易地做到这一点,就像这样。

[Authorize(Roles="Admin")]
public class ManageController : Controller
{
   //....
   Return View();
}

你也可以像这样在 action 方法中使用基于角色的授权。分配多个角色,如果你愿意的话

[Authorize(Roles="Admin")]
public IActionResult Index()
{
/*
 .....
 */ 
}

虽然这可以正常工作,但为了更好地实践,您可能需要阅读有关使用基于策略的角色检查的信息。你可以在 ASP.NET 核心文档here 上找到它,或者我写的这篇文章here

【讨论】:

  • 这很好用,我肯定会把它标记为答案,但我有一个问题。出于某种原因,如果 UserName 和 Email 的值不同,它不会接受我的登录。例如:{UserName = "Joe@gmail.com", Email = "Joe@gmail.com"} 有效,但 {UserName = "Admin", Email = "Joe@gmail.com"} 在尝试登录时返回无效登录使用电子邮件和密码。
  • 我想通了。显然,创建默认 AccountController 登录操作的人没有注意到 SignInPasswordAsync 使用的是用户名和密码,而不是电子邮件和密码。我必须通过删除依赖属性“EmailAddres”来更改它并更改 LoginViewModel
  • "确保你有 IServiceProvider 作为 Configure 类中的参数"---你能举例说明怎么做吗? 1.在默认的asp.net core启动中,没有Configure类; 2.默认注入为IServiceCollection services
【解决方案2】:

将 ASP.NET 标识添加到项目后,您可以在应用程序中实现 Role based Authorization。基本上,它允许您为控制器设置[Authorize(Roles = "Administrator")] 属性,该属性仅适用于管理员用户。

【讨论】:

  • 使用角色是一种不鼓励和过时的概念。您应该使用基于策略的授权,其中“角色”被视为声明,因为它比角色更灵活
  • 同意,但对于问题中描述的简单场景,基于角色的授权可能更直接。将来它可以很容易地迁移到基于策略的授权
  • 如何为我的项目添加身份?
  • 看看here
猜你喜欢
  • 2022-12-24
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2019-09-01
  • 2023-03-04
  • 2016-12-23
  • 2020-03-08
  • 2018-10-27
相关资源
最近更新 更多