IServiceCollection 不包含 AddDefaultIdentity 的定义
IServiceCollection does not contain a definition for AddDefaultIdentity
知道为什么我会收到此错误吗?错误消息 -->“IServiceCollection 不包含 AddDefaultIdentity 的定义”
public class Program
{
public async static void Main(string[] args)
{
await Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseContentRoot(Directory.GetCurrentDirectory());
webBuilder.UseKestrel();
webBuilder.UseAzureAppServices();
webBuilder.UseStartup<Startup>();
})
.Build()
.RunAsync();
}
}
public class Startup
{
public Startup(IConfiguration configuration, IHostEnvironment hostEnvironment)
{
Configuration = configuration;
HostEnvironment = hostEnvironment;
}
public IConfiguration Configuration { get; }
protected IApplicationBuilder ApplicationBuilder { get; private set; }
public IHostEnvironment HostEnvironment { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// services.AddRazorPages();
services.AddDefaultIdentity<ApplicationUser>() // "ApplicationUser" is named incorrectly, it should be "IdentityUser" instead, as per Microsoft documentation.
.AddRoles<IdentityRole<Guid>>()
.AddEntityFrameworkStores<ApplicationContext, Guid>() // FYI - AddEntityFrameworkStores() deal with role that derives from IdentityRole, as per documentation.
//.AddDefaultUI()
.AddDefaultTokenProviders();
// [ Old version #1 - replacement ]
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = new PathString("/Home/Index");
options.SlidingExpiration = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(this.Configuration.GetValue<int?>("Authentication:SlidingExpirationTime").Value);
options.AccessDeniedPath = new PathString("/Home/AccessDenied");
});
// [ Old version #2 - replacement ]
services.Configure<IdentityOptions>(options =>
{
options.Password.RequireUppercase = false;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireDigit = false;
options.Password.RequiredLength = 7;
});
services.AddMvc();
services.AddSession();
//services.Configure<AuthorizationOptions>(options =>
//{
//});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
// Config Exception.
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseExceptionHandler("/Home/ErrorPage.html");
app.UseStaticFiles(); // Note, we are not authenticating for static files if this is before them
app.UseSession();
app.UseAuthentication();
// MVC.
// app.UseMvc(routes => routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"));
}
}
public class ApplicationUser : IdentityUser<Guid>, IUser
{
}
public interface IUser
{
}
public class ApplicationContext : IdentityDbContext<ApplicationUser, IdentityRole<Guid>, Guid>
{
public ApplicationContext(DbContextOptions<ApplicationContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="3.1.3" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.AzureStorage" Version="1.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Version="1.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Session" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="3.1.3" />
<PackgaeReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="1.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.2" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="Microsoft.AspNetCore.AzureAppServicesIntegration" Version="1.0.2" />
</ItemGroup>
</Project>
-- 已编辑 - 下面的新更新。 ---------------------------------------------- -----
好的,这有助于添加“Microsoft.AspNetCore.Identity.UI”NuGet 包。现在我 运行 陷入另一个错误。 :-/ 我无法理解这个。
services.AddDefaultIdentity<ApplicationUser>()
.AddRoles<IdentityRole<Guid>>()
.AddEntityFrameworkStores<ApplicationContext, Guid>()
.AddDefaultTokenProviders();
第一行的错误现在消失了。但是现在第 3 行出现新错误,“AddEntityFrameworkStore()”。错误消息是 --> “IdentityBuilder”不包含“AddEntityFrameworkStores”的定义 & 无法找到接受类型“IdentityBuilder”的第一个参数的可访问扩展方法“AddEntityFrameworkStores”(您是否缺少 using 指令或程序集引用?).
甚至不确定这个“AddEntityFrameworkStores”来自哪个 NuGet 包以及从版本 1 到 3.1 有什么变化。
您需要添加对 Microsoft.AspNetCore.Identity.UI nuget package 的引用才能使用 AddDefaultIdentity
。但是,如果您不想迁移到 Identity Razor Class 库,我认为您仍然可以在核心 3.1 中使用 .AddIdentity<ApplicationUser, IdentityRole>()
。如果您确实想迁移到 RCL,2.0 到 2.1 的迁移文档可能是一个很好的起点:
https://docs.microsoft.com/en-us/aspnet/core/migration/20_21?view=aspnetcore-3.1#changes-to-authentication-code
--- 已编辑 ---
我已经将一些站点从 1.1 迁移到 3.1,我发现最简单的方法是:
- 将整个解决方案移至备份文件夹(确保将源代码控制文件保留在原处)。
- 在您的原始位置创建一个与目标 3.1 完全相同的名称的新应用程序。我在 VS 2019 中使用 "Web Application (Model-View-Controller)" 模板并将身份验证更改为 "Individual User Accounts".
- 将其提交给源代码管理,这样您就可以看到所做的更改。
- 将所有页面、视图控制器和其他代码复制到新应用程序。
- 添加回任何丢失的 nuget 包。
- 您可能需要对复制的代码进行一些更改,但您可以将源代码管理和迁移文档中的更改用作参考点。
它仍然需要很多时间才能让它工作,但否则你将需要浏览每个迁移文档,从 1.x 到 2.0 的文档开始,一直到 3.0 到 3.1 的文档。
我不知道这是什么时候加入的,但在 AspNetCore 5.0 中:services.AddIdentityCore<ApplicationUser>()
有效。仅包含 TUser 的类型要求。
知道为什么我会收到此错误吗?错误消息 -->“IServiceCollection 不包含 AddDefaultIdentity 的定义”
public class Program
{
public async static void Main(string[] args)
{
await Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseContentRoot(Directory.GetCurrentDirectory());
webBuilder.UseKestrel();
webBuilder.UseAzureAppServices();
webBuilder.UseStartup<Startup>();
})
.Build()
.RunAsync();
}
}
public class Startup
{
public Startup(IConfiguration configuration, IHostEnvironment hostEnvironment)
{
Configuration = configuration;
HostEnvironment = hostEnvironment;
}
public IConfiguration Configuration { get; }
protected IApplicationBuilder ApplicationBuilder { get; private set; }
public IHostEnvironment HostEnvironment { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// services.AddRazorPages();
services.AddDefaultIdentity<ApplicationUser>() // "ApplicationUser" is named incorrectly, it should be "IdentityUser" instead, as per Microsoft documentation.
.AddRoles<IdentityRole<Guid>>()
.AddEntityFrameworkStores<ApplicationContext, Guid>() // FYI - AddEntityFrameworkStores() deal with role that derives from IdentityRole, as per documentation.
//.AddDefaultUI()
.AddDefaultTokenProviders();
// [ Old version #1 - replacement ]
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = new PathString("/Home/Index");
options.SlidingExpiration = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(this.Configuration.GetValue<int?>("Authentication:SlidingExpirationTime").Value);
options.AccessDeniedPath = new PathString("/Home/AccessDenied");
});
// [ Old version #2 - replacement ]
services.Configure<IdentityOptions>(options =>
{
options.Password.RequireUppercase = false;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireDigit = false;
options.Password.RequiredLength = 7;
});
services.AddMvc();
services.AddSession();
//services.Configure<AuthorizationOptions>(options =>
//{
//});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
// Config Exception.
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseExceptionHandler("/Home/ErrorPage.html");
app.UseStaticFiles(); // Note, we are not authenticating for static files if this is before them
app.UseSession();
app.UseAuthentication();
// MVC.
// app.UseMvc(routes => routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"));
}
}
public class ApplicationUser : IdentityUser<Guid>, IUser
{
}
public interface IUser
{
}
public class ApplicationContext : IdentityDbContext<ApplicationUser, IdentityRole<Guid>, Guid>
{
public ApplicationContext(DbContextOptions<ApplicationContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="3.1.3" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.AzureStorage" Version="1.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Version="1.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Session" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="3.1.3" />
<PackgaeReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="1.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.2" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="Microsoft.AspNetCore.AzureAppServicesIntegration" Version="1.0.2" />
</ItemGroup>
</Project>
-- 已编辑 - 下面的新更新。 ---------------------------------------------- -----
好的,这有助于添加“Microsoft.AspNetCore.Identity.UI”NuGet 包。现在我 运行 陷入另一个错误。 :-/ 我无法理解这个。
services.AddDefaultIdentity<ApplicationUser>()
.AddRoles<IdentityRole<Guid>>()
.AddEntityFrameworkStores<ApplicationContext, Guid>()
.AddDefaultTokenProviders();
第一行的错误现在消失了。但是现在第 3 行出现新错误,“AddEntityFrameworkStore
甚至不确定这个“AddEntityFrameworkStores”来自哪个 NuGet 包以及从版本 1 到 3.1 有什么变化。
您需要添加对 Microsoft.AspNetCore.Identity.UI nuget package 的引用才能使用 AddDefaultIdentity
。但是,如果您不想迁移到 Identity Razor Class 库,我认为您仍然可以在核心 3.1 中使用 .AddIdentity<ApplicationUser, IdentityRole>()
。如果您确实想迁移到 RCL,2.0 到 2.1 的迁移文档可能是一个很好的起点:
https://docs.microsoft.com/en-us/aspnet/core/migration/20_21?view=aspnetcore-3.1#changes-to-authentication-code
--- 已编辑 ---
我已经将一些站点从 1.1 迁移到 3.1,我发现最简单的方法是:
- 将整个解决方案移至备份文件夹(确保将源代码控制文件保留在原处)。
- 在您的原始位置创建一个与目标 3.1 完全相同的名称的新应用程序。我在 VS 2019 中使用 "Web Application (Model-View-Controller)" 模板并将身份验证更改为 "Individual User Accounts".
- 将其提交给源代码管理,这样您就可以看到所做的更改。
- 将所有页面、视图控制器和其他代码复制到新应用程序。
- 添加回任何丢失的 nuget 包。
- 您可能需要对复制的代码进行一些更改,但您可以将源代码管理和迁移文档中的更改用作参考点。
它仍然需要很多时间才能让它工作,但否则你将需要浏览每个迁移文档,从 1.x 到 2.0 的文档开始,一直到 3.0 到 3.1 的文档。
我不知道这是什么时候加入的,但在 AspNetCore 5.0 中:services.AddIdentityCore<ApplicationUser>()
有效。仅包含 TUser 的类型要求。