代码之家  ›  专栏  ›  技术社区  ›  Jamil

aspnetcore无法解析服务

  •  4
  • Jamil  · 技术社区  · 6 年前

    我正在将microsoft.aspnetcore.identity添加到项目中,然后

    InvalidOperationException:试图激活“web.security.services.security service”2[web.security.entities.iuser'1[system.int32]]'时,无法解析“microsoft.aspnetcore.identity.signinManager”1[web.security.entities.iuser'1[system.int32],system.int32]类型的服务。

    例外是从邮差复制粘贴,它编码了一些符号。 这是我的初创公司.cs:

    public class Startup
    {
        ServiceProvider serviceProvider;
        IConfigurationRoot configurationRoot;
        public IConfiguration Configuration { get; }
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
    
            configurationRoot = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: false)
                .AddIniFile("3CXPhoneSystem.ini")
                .Build();
        }
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            serviceProvider = services
                      .AddLogging((builder) => builder.SetMinimumLevel(LogLevel.Trace))            
               .AddSingleton<ISecurityService, SecurityService<IUser<int>, int>>()
                     .AddSingleton<ITaskService, TaskService>()
                     .AddTransient<IEmailSender, EmailSender>()
                     .AddSingleton<ITranslation, Translation>()
               .BuildServiceProvider();
            services.AddDbContext<SecurityDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("dataContext")));
    
            services.AddIdentity<Web.Security.Entities.User<int>, IdentityRole>()
            .AddEntityFrameworkStores<SecurityDbContext>()
            .AddDefaultTokenProviders();
    
            services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>
            {
                builder
                .AllowAnyMethod()
                .AllowAnyHeader()
                .WithOrigins("http://localhost:52170");
            }));
            services.AddMvc();
    
            services.Configure<IdentityOptions>(options =>
            {
                // Password settings
                options.Password.RequireDigit = true;
                options.Password.RequiredLength = 8;
                options.Password.RequireNonAlphanumeric = false;
                options.Password.RequireUppercase = true;
                options.Password.RequireLowercase = false;
                options.Password.RequiredUniqueChars = 6;
    
                // Lockout settings
                options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
                options.Lockout.MaxFailedAccessAttempts = 10;
                options.Lockout.AllowedForNewUsers = true;
    
                // User settings
                options.User.RequireUniqueEmail = true;
            });
    
    
        }
    
    
    
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseDefaultFiles();
            app.UseStaticFiles();
    
            app.Use(async (context, next) =>
            {
                await next();
    
                if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value) && !context.Request.Path.Value.StartsWith("api"))
                {
                    context.Response.Redirect("/");
                }
            });
    
    
            app.UseMvc(routes =>
            {
                routes.MapRoute(name: "DefaultApi", template: "api/{controller}/{action}/{id?}");
                routes.MapRoute("RouteToAngular", "{*url}", defaults: new { controller = "Route", action = "Index" });
    
            });
    
            app.UseAuthentication();
    
            app.UseCors("CorsPolicy");
        }
    

    在这里,SecurityService是一个类,它将处理注册/登录/其他与身份相关的请求,如下所示

    public class SecurityService<TUser, TKey> : ISecurityService where TUser : class, IUser<TKey>
    {
        SignInManager<TUser> signInManager;
        IConfiguration configuration;
        private readonly IHttpContextAccessor httpContextAccessor;
        UserManager<TUser> userManager;
        IEmailSender emailSender;
        IUrlHelper urlHelper;
        ISession session;
        ILogger<SecurityService<TUser, TKey>> logger;
        ITranslation translation; 
    
        public SecurityService(
            SignInManager<TUser> signInManager,
            UserManager<TUser> userManager,
            IConfiguration configuration,
            IHttpContextAccessor httpContextAccessor,
            IEmailSender emailSender,
            IUrlHelper urlHelper,
            ISession session,
            ILogger<SecurityService<TUser, TKey>> logger,
            ITranslation translation)
        {
            this.signInManager = signInManager;
            this.userManager = userManager;
            this.configuration = configuration;
            this.httpContextAccessor = httpContextAccessor;
            this.urlHelper = urlHelper;
            this.session = session;
            this.logger = logger;
            this.translation = translation;
            this.emailSender = emailSender;
        }
    

    保险箱:

    public interface IUser<TKey>
    {
        TKey Id { get; set; }
        string UserName { get; set; }
        string Email { get; set; }
        bool EmailConfirmed { get; set; }
    }
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   Chris Pickford    6 年前

    你需要使用 IdentityBuilder 扩展方法 AddSignInManager 明确地。

    services.AddIdentity<Web.Security.Entities.User<int>, IdentityRole>()
        .AddEntityFrameworkStores<SecurityDbContext>()
        // Replace ApplicationUser with your concrete user class
        .AddSignInManager<SignInManager<ApplicationUser>>() 
        .AddDefaultTokenProviders();
    

    如果您需要在安全服务中访问它,那么可以注入它:

    public class SecurityService<TUser, TKey> ...
    {
        public SecurityService(SignInManager<ApplicationUser> signInManager)
        {
            this.signInManager = signInManager;
        }
    }