AddIdentity()失败“ InvalidOperationException:方案已经存在:Identity.Application”

时间:2018-07-03 19:31:06

标签: asp.net-identity asp.net-core-2.0

我正在尝试将Facebook登录名添加到我的.NET Core 2.1站点

紧跟this,指南this (for facebook login)

将以下几行添加到startup.cs之后,在ConfigureServices-method之内

 public void ConfigureServices(IServiceCollection services)
 {
    ...
    services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
    ...
 }

我在运行应用程序时收到错误消息。没有这些行,它将“正常”运行。用户可以登录到Facebook并批准我的申请,然后我收到电子邮件,但没有收到。但是我猜用户信息不会被添加到我的数据库中

  

InvalidOperationException:方案已经存在:Identity.Application   Microsoft.AspNetCore.Authentication.AuthenticationOptions.AddScheme(字符串   名称,操作configureBuilder)...

代码超过了添加的行,并且不久(启动期间)后出现错误。我已经在我的项目中进行了搜索(从模板中只是一个裸露的.NET Core 2.1 Web应用程序),但是看不到“ AddIdentity”的任何其他用法。

我确实找到了“ AddDEfaultIdentity()”,将该行注释掉了。但后来我得到了

  

InvalidOperationException:没有针对该类型的服务   'Microsoft.AspNetCore.Identity.UserManager`1 [Microsoft.AspNetCore.Identity.IdentityUser]'   已注册。 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供者,类型serviceType)

8 个答案:

答案 0 :(得分:12)

我有一个类似的问题。这对使用.Net Core 3.0的人可能更有用。深入研究后,我发现一旦您使用脚手架创建了“身份”区域。在Identity文件夹中创建了一个名为“ IdentityHostingStartup.cs”的文件。

IdentityHostingStartup Location

在类中,将创建“ AddDefaultIdentity”的另一个实例以及其他一些服务。

IdentityHostingStartup File View

如果从“ Startup.cs”中删除“ addDefaultIdentity”,则您的应用应启动。另外,如果收到空连接字符串错误。更新IdentityHostintgStartup.cs内部的连接字符串

注意:删除两个addDefaultIdentities都可以。您只是不能在两个地方都拥有它。

希望这会有所帮助。

答案 1 :(得分:3)


我遇到了同样的问题,我同时在两个不同的文件中注册服务:Startup.cs和IdentityHostingStartup.cs文件。

我做了什么?

我分别在两个文件中注册了服务,如下所示:

IdentityHostingStartup.cs

我仅在此文件中注册了身份数据库上下文:
//lets register identity db context builder.ConfigureServices((context, services) => { services.AddDbContext<IdentityDbContext>(options => options.UseSqlServer( context.Configuration.GetConnectionString("IdentityDBConnection"), x => x.MigrationsAssembly("WebApplication1") ) );

Startup.cs

在此文件中,我注册了DefaultIdentity,角色和EntityFrameworkstores
//I registered the DefaultIdentity, the Roles and the EntityFrameworkstores services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles<IdentityRole>().AddEntityFrameworkStores<IdentityDbContext>();

答案 2 :(得分:2)

我也有同样的问题。

我在2个地方发现了services.AddIdentity<ApplicationUser, ApplicationRole>()

我删除了其中一个,现在一切正常。

答案 3 :(得分:1)

这是对.Net Core 2.0-> 2.1的更改,我认为该指南尚未更新。

绊倒this SO post后,我: 删除了整个服务行。AddIdentity()...调用(所有3行)(但是当然保留了之前的AddDefaultIdentity()调用

更改回ApplicationDbContext.cs。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

public class ApplicationDbContext : IdentityDbContext<IdentityUser>

...因此,如果您是从头开始(新的.Net Core 2.1模板),那么您要做的就是添加行

     services.AddAuthentication().AddFacebook(facebookOptions =>
        {
            facebookOptions.AppId = Configuration["...FacebookLogin:AppId"];
            facebookOptions.AppSecret = Configuration["...FacebookLogin:ClientSecret"];
        });

来自教程。

至少这个“修正”使我了解到用户可以注册的程度,还没有调查我的“ ApplicationUser”去向(以防万一/当我想添加更多用户属性时)...因为没有参考

答案 4 :(得分:0)

对我来说(ASP.NET Core v2),我有:

 services.AddIdentity<MyUser, MyRole>()
                    .AddEntityFrameworkStores<ApplicationDbContext>()
                    .AddUserStore<MyUserStore>()
                    .AddRoleStore<MyRoleStore>()
                    .AddRoleManager<MyRoleManager>()
                    .AddDefaultTokenProviders();
在Startup.cs中

。当我搭建身份时,它添加了IdentityHostingStartup.cs,并且我根据一些发送电子邮件的代码复制/粘贴了另一个类似但默认的阻止:

builder.ConfigureServices((context, services) =>
                {
                    services.AddDefaultIdentity<IdentityUser>(config =>
                    {
                        config.SignIn.RequireConfirmedEmail = false;//TODO:
                    })
                    .AddEntityFrameworkStores<ApplicationDbContext>();
                });

所以我将所有身份配置都移到了IdentityHostingStartup.cs中(即只有1个配置!!),它按预期工作了...

答案 5 :(得分:0)

就我而言,问题出在添加之后:

services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();

与以下代码冲突,位于Startup.cs中:

services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyConnectionString")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();

答案 6 :(得分:0)

如果从“ Startup.cs”中删除“ addDefaultIdentity”对您不起作用。

services.AddDefaultIdentity<ApplicationUser>替换为AddIdentity<ApplicationUser, IdentityRole>

Code snippet

  /*
            services.AddIdentity<ApplicationUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<ApplicationDbContext>();
            */
            
            services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<ApplicationDbContext>();

答案 7 :(得分:0)

我的插件 Kestrel Web 服务器项目遇到了同样的问题。 我有一个使用 Microsoft Identity 的插件,当我使用该插件两次时,出现“InvalidOperationException:Scheme already exists: Identity.Application”异常。

正如本主题前面提到的,错误来自多次调用“services.AddIdentity”。在我的项目中,每次使用插件时都会出现一次。

无论如何,解决方案是更换:

services.AddIdentity<IdentityUser, ItentityRole>((options) => { ... })....

与:

services.AddIdentityCore<IdentityUser>((options) => { ... }).AddRoles<IdentityRole>()....

后者显然捕获了异常。