【问题标题】:AspNetCore unable to resolve serviceAspNetCore 无法解析服务
【发布时间】:2018-07-03 10:54:54
【问题描述】:

我正在将 Microsoft.AspNetCore.Identity 添加到项目中,我得到了

InvalidOperationException:尝试激活“Web.Security.Services.SecurityService”时无法解析类型“Microsoft.AspNetCore.Identity.SignInManager'1[Web.Security.Entities.IUser'1[System.Int32]]”的服务'2[Web.Security.Entities.IUser'1[System.Int32],System.Int32]'。

异常是从邮递员复制粘贴的,它编码了一些符号。 这是我的 Startup.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;
    }

IUser.cs:

public interface IUser<TKey>
{
    TKey Id { get; set; }
    string UserName { get; set; }
    string Email { get; set; }
    bool EmailConfirmed { get; set; }
}

【问题讨论】:

    标签: c# asp.net-core asp.net-identity


    【解决方案1】:

    您需要明确使用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;
        }
    }
    

    【讨论】:

    • 添加了 AddSignInManager,但没有帮助。我用 SecurityService 的构造函数更新了我的帖子。
    • 我认为你的问题是你试图用一个接口实例化UserManager,而不是一个具体的用户类。
    • 最后我删除了所有的泛型,修复了一些其他的错误并且它起作用了。是的,界面是个问题(在那种情况下不是,但仍然如此)。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    相关资源
    最近更新 更多