C# 现有项目中的IdentityServer3、Autofac、IdentityFramework

C# 现有项目中的IdentityServer3、Autofac、IdentityFramework,c#,asp.net-web-api,asp.net-identity,autofac,identityserver3,C#,Asp.net Web Api,Asp.net Identity,Autofac,Identityserver3,我一直在玩弄IdentityServer3,希望能取代我们目前的身份验证过程。 目前,我们使用代码优先实体框架使用自定义标识框架流程。 我设法安装了IdentityServer3,并让“内存中”的东西正常工作。现在我想把它连接到我们已经定制的用户提供者(用户管理器,如果您愿意的话) 我们已经使用Autofac,并已按如下方式注册了我们的用户提供程序: builder.RegisterType<UserProvider>().As<IUserProvider>().Inst

我一直在玩弄IdentityServer3,希望能取代我们目前的身份验证过程。 目前,我们使用代码优先实体框架使用自定义标识框架流程。 我设法安装了IdentityServer3,并让“内存中”的东西正常工作。现在我想把它连接到我们已经定制的
用户提供者
用户管理器
,如果您愿意的话)

我们已经使用Autofac,并已按如下方式注册了我们的
用户提供程序

builder.RegisterType<UserProvider>().As<IUserProvider>().InstancePerDependency();
options.Factory.UserService = new Registration<IUserService>(UserServiceFactory.Create())
public class UserServiceFactory
{
    public static AspNetIdentityUserService<User, string> Create()
    {
        var context = new IdentityDbContext();
        var userStore = new UserStore<User>(context);
        var userManager = new UserManager<User>(userStore);

        return new AspNetIdentityUserService<User, string>(userManager);
    }
}
builder.RegisterType<IdentityServerUserService>()
       .As<IdentityServer3.Core.Services.IUserService>()
       .InstancePerDependency();
private static void SetupServices(IdentityServerOptions options, ILifetimeScope scope)
{
    options.Factory.UserService = new Registration<IUserService>(scope.Resolve<IdentityServerUserService>());
}
var config = new HttpConfiguration();
var scope = config.DependencyResolver.GetRootLifetimeScope(); 
我的问题是,工厂看起来像这样:

builder.RegisterType<UserProvider>().As<IUserProvider>().InstancePerDependency();
options.Factory.UserService = new Registration<IUserService>(UserServiceFactory.Create())
public class UserServiceFactory
{
    public static AspNetIdentityUserService<User, string> Create()
    {
        var context = new IdentityDbContext();
        var userStore = new UserStore<User>(context);
        var userManager = new UserManager<User>(userStore);

        return new AspNetIdentityUserService<User, string>(userManager);
    }
}
builder.RegisterType<IdentityServerUserService>()
       .As<IdentityServer3.Core.Services.IUserService>()
       .InstancePerDependency();
private static void SetupServices(IdentityServerOptions options, ILifetimeScope scope)
{
    options.Factory.UserService = new Registration<IUserService>(scope.Resolve<IdentityServerUserService>());
}
var config = new HttpConfiguration();
var scope = config.DependencyResolver.GetRootLifetimeScope(); 
我得到的范围如下:

builder.RegisterType<UserProvider>().As<IUserProvider>().InstancePerDependency();
options.Factory.UserService = new Registration<IUserService>(UserServiceFactory.Create())
public class UserServiceFactory
{
    public static AspNetIdentityUserService<User, string> Create()
    {
        var context = new IdentityDbContext();
        var userStore = new UserStore<User>(context);
        var userManager = new UserManager<User>(userStore);

        return new AspNetIdentityUserService<User, string>(userManager);
    }
}
builder.RegisterType<IdentityServerUserService>()
       .As<IdentityServer3.Core.Services.IUserService>()
       .InstancePerDependency();
private static void SetupServices(IdentityServerOptions options, ILifetimeScope scope)
{
    options.Factory.UserService = new Registration<IUserService>(scope.Resolve<IdentityServerUserService>());
}
var config = new HttpConfiguration();
var scope = config.DependencyResolver.GetRootLifetimeScope(); 
我相信这应该行得通,但我尝试使用postman进行身份验证时出错:

Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务“Business.IdentityServerUserService”尚未注册。要避免此异常,请注册组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解析可选依赖项

我试图从
InstancePerDependency
更改为
InstancePerLifetimeScope
,但仍然得到相同的错误

因此,我有几个问题:

  • 这是分配用户服务的正确方法吗
  • 这是否允许我的现有用户进行身份验证
  • 以前有人这样做过吗?如果是的话,他们有没有让它发挥作用

如果有人能帮我解答这些问题,我将永远感激。

您解决
IdentityServerUserService
问题,但您将
IdentityServerUserService
注册为
IUserService
。Autofac不会自动将类型注册为其自身

要修复此错误,可以将类型注册为自身

builder.RegisterType<IdentityServerUserService>()
       .As<IdentityServer3.Core.Services.IUserService>()
       .InstancePerDependency();