为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 ASP.NET 核心 2.2 中实现标识

如何在 ASP.NET 核心 2.2 中实现标识

C#
慕后森 2022-08-20 15:16:20
在我的网站中,我想让管理员使用帐户登录以修改数据库。此外,我可能会在将来添加一些角色和帐户。因此,我正在尝试实现标识。我在Visual Studio 2019中做了一个项目(不确定这是否重要),并使用MVC选择了 ASP.NET Core 2.2(我自己安装了Core 2.2),使用个人用户帐户进行身份验证,我点击了显示:“配置HTTPS”的框。完成项目后,我打开它,创建一个随机帐户,得到一个错误,然后迁移数据库以修复它。然后,我添加:appsetting.json"UserSettings": {    "UserName": "MyAdminUser",    "UserEmail": "MyAdminUser@gmail.com",    "UserPassword": "A_123456a"}在文件夹内创建一个新类:Datausing System;using System.Threading.Tasks;using Microsoft.AspNetCore.Identity;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;namespace WebApplication1.Data {    public static class Seed {        public static async Task CreateRoles(IServiceProvider serviceProvider, IConfiguration Configuration) {            // Add customs roles            var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();            // Note: I used IdentityUser instead of make my ApplicationUser as other people do because the default idendity is fine for me, I don't need additional fields nor I want to make this more difficult.            var UserManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();            string[] roleNames = { "Admin" };            IdentityResult roleResult;            foreach (var roleName in roleNames) {                // Create roles and seeding them to the database                var roleExist = await RoleManager.RoleExistsAsync(roleName);                if (!roleExist) {                    roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));                }            }            // Create a super user            var poweruser = new IdentityUser {                UserName = Configuration.GetSection("AppSettings")["UserSettings:UserName"],                Email = Configuration.GetSection("AppSettings")["UserSettings:UserEmail"]            };}
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

问题是,您尝试在不创建作用域的情况下从中检索作用域服务。有趣的是,您在对 的调用周围创建了一个作用域,但随后传入 了 未限定作用域。IServiceProviderSeed.CreateRolesIServiceProvider

您应该做的是传入并在方法中创建作用域,或者将作用域创建保留在现在的位置,而是传入作用域服务,即 和。IServiceProviderSeed.CreateRolesRoleManagerUserManager

编辑


您需要执行下列操作之一:


注入,然后在种子方法中创建您的范围:IServiceProvider


var host = CreateWebHostBuilder(args).Build();

Seed.CreateRoles(host.Services);

host.Run();

然后:


public static async Task CreateRoles(IServiceProvider services) {

    var configuration = services.GetRequiredService<IConfiguration>();

    using (var scope = services.CreateScope())

    {

        var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();

        var userManager = scope.ServiceProvider.GetRequiredService<UserManager<IdentityUser>>();


        // seed data

    }

}

注入您的作用域服务:


var host = CreateWebHostBuilder(args).Build();


var configuration = host.Services.GetRequiredService<IConfiguration>();

using (var scope = host.Services.CreateScope())

{

    var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();

    var userManager = scope.ServiceProvider.GetRequiredService<UserManager<IdentityUser>>();

    Seed.CreateRoles(configuration, roleManager, userManager);

}

host.Run();


查看完整回答
反对 回复 2022-08-20
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

运行代码会在以下行中显示异常:

var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

根据异常,您似乎缺少文件中的配置来启用标识。我看不到你的,但我怀疑你错过了整个电话。startup.csstartup.csservices.AddIdentity(...)

我建议您花一些时间阅读如何在 ASP.NET 核心中配置标识。Microsoft Docs 始终是一个很好的起点。

此外,您在问题中提到的第二个问题有很好的步骤。您特别需要查看步骤 2 和步骤 3。


查看完整回答
反对 回复 2022-08-20
  • 2 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号