private void CreateRoles(IServiceProvider serviceProvider)
{
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
Task<IdentityResult> roleResult;
string email = "someone@somewhere.com";
//Check that there is an Administrator role and create if not
Task<bool> 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<ApplicationUser> testUser = userManager.FindByEmailAsync(email);
testUser.Wait();
if (testUser.Result == null)
{
ApplicationUser administrator = new ApplicationUser
{
Email = email,
UserName = email,
Name = email
};
Task<IdentityResult> newUser = userManager.CreateAsync(administrator, "_AStrongP@ssword!123");
newUser.Wait();
if (newUser.Result.Succeeded)
{
Task<IdentityResult> newUserRole = userManager.AddToRoleAsync(administrator, "Administrator");
newUserRole.Wait();
}
}
}
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Sobopedia.Data
{
public class ApplicationUser: IdentityUser
{
public string Name { get; set; }
}
}
结果是按如下方式完成的。首先,我使用了用户 Paul Madson 在https://stackoverflow.com/questions/42471866/how-to-create-roles-in-asp-net-core-and-assign-them-to-users建议的代码。我将以下方法粘贴到 Startup.cs 文件中。它创建一个管理员角色并将其分配给预先创建的用户。
然后,在同一个文件中,在 Configure 方法中,我添加了 IServiceProvider serviceProvider 参数,即在签名方面,它开始看起来像 Configure(..., IServiceProvider serviceProvider)。在其中,最后,我添加了 CreateRoles(serviceProvider) 行。要使此代码正常工作,您必须首先创建,例如,在 Data 文件夹中。下一节课:
最后,在 ConfigureServices 方法中,替换
在
因此,启动程序后,您将在 AspNetRoles 表中拥有一个新角色,并在 AspNetUsers 表中拥有该角色的新用户。
不幸的是,如果您创建了具有初始授权的模板,那么当您添加
登录和注册页面将停止工作。要解决此问题,您需要:
脚手架身份遵循 ( https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.1&tabs=visual-studio )。如果您使用的是具有预构建授权的模板,请参阅 Scaffold 标识到具有授权的 Razor 项目中。
创建模板后,将整个解决方案中的所有 IdentityUser 替换为 ApplicationUser 。除了 ApplicationUser 类,它仍然必须从 IdentityUser 继承。
如果您没有实现,请从 Areas/identity/Pages/Account/Register.cs(即模型)中删除与 EmailSernder 相关的所有内容。
要检查此解决方案工作的正确性,您可以执行以下操作。在 Startup.cs 类的 ConfigureServices 方法的末尾,添加以下内容:
此外,为了安全起见,或者如果此代码不起作用,可以将 [Authorize(Roles = "Administrator")] 添加到联系人页面模型中,使其看起来像这样:
现在,只有当您使用登录名 someone@somewhere.com 和密码 _ASstrongP@ssword!123 登录时,您才能进入联系页面。如果在创建管理员时使用了包含禁止字符但不包含必需字符的密码,则该方法可能不起作用。