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