Получение этой ошибки
InvalidOperationException: No service for type 'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' has been registered.
Я пытаюсь, чтобы identityserver и пользовательский интерфейс идентификации asp.net были в одном проекте.
Следуйте этой статье http://docs.identityserver.io/en/dev/quickstarts/6_aspnet_identity.html#new-project-for-asp-net-identity, чтобы получить необходимый дополнительный код. Я сделал следующие шаги
Создание приложения ASP.NET Core 2.2 MVC, проверка подлинности с одной учетной записью
Протестировал его, чтобы убедиться, что он работает, зарегистрировал пользователя, вошел в систему, все работает хорошо.
Добавлен пакет nuget IdentityServer4.AspnetIdentity
Добавлен файл Config.cs ниже
public static class Config
{
public static IEnumerable<IdentityResource> GetIdentityResources()
{
return new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Profile(),
new IdentityResources.Email(),
};
}
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("eventsapi", "Events Api")
};
}
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = "client",
// no interactive user, use the clientid/secret for authentication
AllowedGrantTypes = GrantTypes.ClientCredentials,
// secret for authentication
ClientSecrets =
{
new Secret("secret".Sha256())
},
// scopes that client has access to
AllowedScopes = { "eventsapi" }
}
};
}
}
Добавлен ApplicationUser.cs
public class ApplicationUser:IdentityUser
{
}
Модифицированный Startup.cs (генерируется закомментированный код)
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
/*
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
*/
//REPLACED ABOVE
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
//ADDDED
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddAspNetIdentity<ApplicationUser>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
//app.UseAuthentication();
//REPLACED ABOVE
app.UseIdentityServer();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}





Для этой ошибки попробуйте заменить IdentityUser на Views\Shared\_LoginPartial.cshtml.
@using Microsoft.AspNetCore.Identity
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
<ul class = "navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class = "nav-item">
<a class = "nav-link text-dark" asp-area = "Identity" asp-page = "/Account/Manage/Index" title = "Manage">Hello @User.Identity.Name!</a>
</li>
<li class = "nav-item">
<form class = "form-inline" asp-area = "Identity" asp-page = "/Account/Logout" asp-route-returnUrl = "@Url.Action("Index", "Home", new { area = "" })">
<button type = "submit" class = "nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class = "nav-item">
<a class = "nav-link text-dark" asp-area = "Identity" asp-page = "/Account/Register">Register</a>
</li>
<li class = "nav-item">
<a class = "nav-link text-dark" asp-area = "Identity" asp-page = "/Account/Login">Login</a>
</li>
}
</ul>
Затем вам нужно зарегистрировать AddDefaultUI, который используется для обработки запроса области идентификации к действию в Startup.cs, например
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
У вас будет этот код где-то в вашем проекте (либо в контроллере, либо, возможно, в представлении):
UserManager<IdentityUser> userManager. Найдите все это и измените их наUserManager<ApplicationUser> userManager.