AspNetCore无法解析服务

时间:2018-07-03 10:54:54

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

我正在将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; }
}

1 个答案:

答案 0 :(得分:5)

您需要显式使用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;
    }
}