我正在尝试将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)
答案 0 :(得分:12)
我有一个类似的问题。这对使用.Net Core 3.0的人可能更有用。深入研究后,我发现一旦您使用脚手架创建了“身份”区域。在Identity文件夹中创建了一个名为“ IdentityHostingStartup.cs”的文件。
在类中,将创建“ AddDefaultIdentity”的另一个实例以及其他一些服务。
如果从“ Startup.cs”中删除“ addDefaultIdentity”,则您的应用应启动。另外,如果收到空连接字符串错误。更新IdentityHostintgStartup.cs内部的连接字符串
注意:删除两个addDefaultIdentities都可以。您只是不能在两个地方都拥有它。
希望这会有所帮助。
答案 1 :(得分:3)
我遇到了同样的问题,我同时在两个不同的文件中注册服务:Startup.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")
)
);
在此文件中,我注册了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>
/*
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>()....
后者显然捕获了异常。