ASP.NET Core MVC исключение при использовании AddSignInManager - PullRequest
0 голосов
/ 30 октября 2019

Я использую проект ASP.NET Core MVC 3.0 API. Я использую Microsoft.AspNetCore.Identity v3.0

В Startup.cs, внутри метода ConfigureServices, когда я набираю нижеприведенное и запускаю приложение, я получаю исключение:

var builder = services.AddIdentityCore<AppUser>();
var identityBuilder = new IdentityBuilder(builder.UserType, builder.Services);
identityBuilder.AddEntityFrameworkStores<DataContext>();
identityBuilder.AddSignInManager<SignInManager<AppUser>>();

Класс AppUser выглядит примерно так:

using Microsoft.AspNetCore.Identity;

namespace Domain
{
    public class AppUser : IdentityUser
    {
        public string DisplayName { get; set; }
    }
}

Исключение, которое я получаю, таково:

Необработанное исключение. System.AggregateException: некоторые службы не могут быть построены (ошибка при проверке дескриптора службы 'ServiceType: Microsoft.AspNetCore.Identity.ISecurityStampValidator Lifetime: Scoped PracticeType: Microsoft.AspNetCore.Identity.SecurityStampValidator`1 [Domain.AppUserНе удалось разрешить службу для типа «Microsoft.AspNetCore.Authentication.ISystemClock» при попытке активировать «Microsoft.AspNetCore.Identity.SecurityStampValidator`1 [Domain.AppUser]».) (Ошибка при проверке дескриптора службы «ServiceType: Microsoft.AspNetCore».Identity.ITwoFactorSecurityStampValidator Время жизни: объем реализации Тип: Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator`1 [Domain.AppUser] ': невозможно разрешить службу для типа «Microsoft.AspNetCore.Authentication.ISspity Activate» блокировать.TwoFactorSecurityStampValidator`1 [Domain.AppUser] '.)

System.InvalidOperationException: Ошибка при проверке thДескриптор службы 'ServiceType: Microsoft.AspNetCore.Identity.ISecurityStampValidator Время жизни: ограничено. Тип реализации: Microsoft.AspNetCore.Identity.SecurityStampValidator`1 [Domain.AppUser]': не удается разрешить службу для типа 'Microsoft.AspNetClock.Cheat.Cheat.Aecheser.Aheпри попытке активировать 'Microsoft.AspNetCore.Identity.SecurityStampValidator`1 [Domain.AppUser]'.

System.InvalidOperationException: не удается разрешить службу для типа "Microsoft.AspNetCore.Authentication.ISystemClock" при попытке активировать "НеобязательныйthrowIfCallSiteNotFound)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite (время жизни ResultCache, тип serviceType, Тип реализацияType, CallSiteChain (callSiteChain)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact (дескриптор ServiceDescriptor, тип serviceType, CallSiteChain.Sec. GetCallSite (ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.ValidateService (дескриптор ServiceDescriptor)
--- конец трассировки стека внутренних исключений --- * 1027. DependencyInjection.ServiceLookup.ServiceProviderEngine.ValidateService (дескриптор ServiceDescriptor)
в Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor (IEnumerable`1 serviceDescriptors, параметры ServiceProviderOptions)
--- конец внутреннего стека исключений1030 * в Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor (IEnumerable`1 serviceDescriptors, опции ServiceProviderOptions) в Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider (услуги IServiceCollection, опционы ServiceProviderOptions) на Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider (IServiceCollection containerBuilder) в Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider(Объект containerBuilder) в Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider ()в Microsoft.Extensions.Hosting.HostBuilder.Build () в Api.Program.Main (String [] args) в C: \ Projects \ XXXXXXXX \ api \ Program.cs: строка 19 ---> (Внутреннее исключение # 1)System.InvalidOperationException: Ошибка при проверке дескриптора службы 'ServiceType: Microsoft.AspNetCore.Identity.ITwoFactorSecurityStampValidator Срок действия: ограниченный объем реализацииType: Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator`1] для разрешения проблемы типа «для домена». AspNetCore.Authentication.ISystemClock 'при попытке активировать' Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator`1 [Domain.AppUser] '. ---> System.InvalidOperationException: невозможно разрешить службу для типа «Microsoft.AspNetCore.Authentication.ISystemClock» при попытке активировать «Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator`1 [Domain.AppUser] '. по адресу Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites (Тип serviceType, Тип instanceType типа, CallSiteChain callSiteChain, ParameterInfo [], Boolean throwIfCallSiteNotFound. creationType, CallSiteChain callSiteChain)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact (дескриптор ServiceDescriptor, тип serviceType, CallSiteChain, слот callSiteChain службы (Int.). callSiteChain) в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.ValidateService (дескриптор ServiceDescriptor) --- Конец внутренней трассировки стека исключений --- в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.ValidateService (дескриптор ServiceDescriptor) в Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor (IEnumerable`1 serviceDescriptors, параметры ServiceProviderOptions) <--- </p>

Есть идеи, что я делаю неправильно?

1 Ответ

1 голос
/ 31 октября 2019

Лучше использовать AddDefaultIdentity, который поможет вам зарегистрировать такие сервисы, как SignInManager. Вы можете использовать следующие шаги:

  1. Изменить файл проекта для установки пакетов:

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
        <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        </PropertyGroup>
    
        <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.0.0" />
        <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.0.0" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
        </ItemGroup>
    
    </Project>
    
  2. Создать DataContext:

    public class DataContext : IdentityDbContext<AppUser>
    {
        public DataContext(DbContextOptions<DataContext> options)
            : base(options)
        {
        }
    
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            // Customize the ASP.NET Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);
        }
    }
    
  3. Startup.cs:

    services.AddDbContext<DataContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    
    services.AddDefaultIdentity<AppUser>()
    .AddEntityFrameworkStores<DataContext>();
    
  4. Inject SignInManager:

    private readonly UserManager<AppUser> _userManager;
    private readonly SignInManager<AppUser> _signInManager;
    private readonly DataContext _context; 
    
    public WeatherForecastController(UserManager<AppUser> userManager,SignInManager<AppUser> signInManager, DataContext dbContext)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _context = dbContext;
    
    }
    

И используйте как:

await _signInManager.SignInAsync(user, isPersistent: false);

...