如何实现身份在ASP.NET 2.2的核心

问题描述 投票:1回答:2

在我的网站,我想让登录与帐户管理员,以修改数据库。另外,我在将来可能会加入一些角色和帐户。

所以,我想实现的身份。

我在Visual Studio 2019(不知道这是很重要的)做了一个项目,然后选择ASP.NET 2.2的核心(我安装在我自己的核心2.2)与MVC,与单个用户帐户验证,我让点击里面说的框:“配置HTTPS”。

一旦取得该项目,我打开它,做一个随机账户,得到了一个错误,然后迁移数据库进行修复。

然后,我加入appsetting.json

"UserSettings": {
    "UserName": "MyAdminUser",
    "UserEmail": "[email protected]",
    "UserPassword": "A_123456a"
}

创建该文件夹内Data一个新的类:

using 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"]
            };

            string userPassword = Configuration.GetSection("AppSettings")["UserSettings:UserPassword"];
            var user = await UserManager.FindByEmailAsync(Configuration.GetSection("AppSettings")["UserSettings:UserEmail"]);

            if (user == null) {
                var createPowerUser = await UserManager.CreateAsync(poweruser, userPassword);
                if (createPowerUser.Succeeded) {
                    // Assign the new user the "Admin" role 
                    await UserManager.AddToRoleAsync(poweruser, "Admin");
                }
            }
        }
    }
}

最后更换Main类的Program方法:

public static void Main(string[] args) {
    var host = CreateWebHostBuilder(args).Build();    
    using (var scope = host.Services.CreateScope()) {
        var services = scope.ServiceProvider;
        var serviceProvider = services.GetRequiredService<IServiceProvider>();
        var configuration = services.GetRequiredService<IConfiguration>();
        Seed.CreateRoles(serviceProvider, configuration).Wait();
    }    
    host.Run();
}

但是,当我运行它,错误HTTP Error 500.30 - ANCM In-Process Start Failure提高网页上和调试控制台说,但下列情况除外:

  • 'System.InvalidOperationException' in Microsoft.Extensions.DependencyInjection.Abstractions.dll
  • 'System.AggregateException' in System.Private.CoreLib.dll

我不知道如何解决。

另外,我发现所有这些问题(与自己的答案)123456这些非SO 78。但我与他们的主要问题是,每个人用不同的方式来实现身份(他们中的一些已经过时至2.2),我不知道哪一个更好,甚至在我的项目的一些引发错误或我不明白在所有的,所以我试图做到这一点(我读了执行该代码ProgramStartup更好的性能比较)。

顺便说一句,我也试图从Programm删除我的代码,并从Configure参数Startup并在IServiceProvider serviceProvider方法,而不是补充:

// I used _ = because VS said me something about async
_ = Seed.CreateRoles(serviceProvider, Configuration);
c# asp.net asp.net-core .net-core asp.net-core-mvc
2个回答
0
投票

问题是,你试图检索IServiceProvider范围的服务,而无需创建范围。有趣的是,你创建你的周围调用Seed.CreateRoles一个范围,但你在IServiceProvider,这是不作用域通过。

你应该做的是在IServiceProvider无论是传球和创建Seed.CreateRoles方法内的范围,或离开范围创建它现在是,而是通过在你的范围的服务,即RoleManagerUserManager

编辑

你需要做以下之一:

  1. 注入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 } }
  2. 注入你的范围的服务: 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();

0
投票

运行你的代码显示了以下行异常:

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

基于异常看来你缺少在startup.cs文件中的配置,以使身份。我看不到你的startup.cs但我怀疑你缺少整个services.AddIdentity(...)电话。

我建议你花一些时间来了解如何在ASP.NET核心配置Identity读了。该Microsoft Docs总是开始的好地方。

此外,你在你的问题中提到的second question具有良好的步骤。特别需要关注一下步骤2和步骤3。

© www.soinside.com 2019 - 2024. All rights reserved.