我使用IdentityServer3进行身份验证AspnetIdentity
进行用户存储。我有ApplicationUserManager
类,它有static Create
方法,用于配置UserValidator,PasswordValidator,IdentityTokenProvider等,并返回ApplicationUserManager
类
ApplicationUserManager
public class ApplicationUserManager : UserManager<ApplicationUser, string>
{
public ApplicationUserManager(ApplicationUserStore store)
: base(store)
{
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new ApplicationUserStore(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
manager.EmailService = new EmailService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
}
如何使用ApplicationUserManager
注册IdentityServerServiceFactory
的静态创建方法,以便每个请求可以使用单个实例。
public static IdentityServerServiceFactory Configure(this IdentityServerServiceFactory factory, string connectionString)
{
factory.UserService = new Registration<IUserService, UserService>();
// ????? HOW do I Register ApplicationUserManager's static Create method. ???
// ????? The line below will not configure Validators, IdentityTokenProvider, EmailService etc ?????
factory.Register(new Registration<ApplicationUserManager>());
factory.Register(new Registration<ApplicationUserStore>());
factory.Register(new Registration<ApplicationDbContext>(resolver => new ApplicationDbContext(connectionString)));
return factory;
}
更新1
我将在这里解释我的核心问题。我们有3个VS应用程序用于整个身份解决方案。
1&GT; Identity Server :这是仅用于身份验证的identityserver3。
2 - ; 管理员门户:只有开发人员/管理员才能访问此应用程序,以管理用户,客户端和范围。这是VS解决方案,它结合了IdentityServer3.Admin和IdentityManager
3&gt; 客户端门户:此应用程序可供最终用户访问,用户可以在其中重置密码,更改密码。这是标准的VS ASP.NET MVC5应用程序。
所有3个应用程序共享相同的实体,例如ApplicationUser
,ApplicationUserStore
,ApplicationDbContext
,ApplicationRole
,ApplicationUserManager
等。
我关注ApplicationUserManager
,EmailService
,UserTokenProvider
,PasswordValidator
通过Create
方法配置了ApplicationUserManager
。
所有3个应用程序共享ApplicationUserManager
并将其用于不同的目的。
AdminPortal:此应用程序会创建新用户,因此必须遵循密码&amp;用户名要求。因此,我需要使用IdentityManagerServiceFactory
向其ApplicationUserManager
创建方法。我再怎么做?
ClientPortal:这是用户重置&amp;更改密码。它必须遵循密码要求,它还需要EmailService&amp; UserTokenProvider。由于这是标准的VS MVC应用程序。我可以使用OWIN
上下文的Create方法注册app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
ApplicationUserManager
IdentityServer:我不知道它是否足以用默认构造函数注册VB.NET
(默认构造函数不会配置验证器,UserTokenProvider,EmailService)。
或者IdentityServer是否还需要我在创建用户时使用的PasswordValidator,UserNameValidator,UserTokenProvider,EmailSerice?
答案 0 :(得分:1)
我想以下应该有效
factory.Register(new Registration<ApplicationUserManager>(resolver => ApplicationUserManager.Create(options,context)));
如果您需要将其他注册服务(例如记录器)作为参数传递给您创建&#39;您可以按如下方法解决这些问题
new Registration<ApplicationUserManager>(resolver =>
ApplicationUserManager.Create(options,context,resolver.Resolve<ICustomLogger>())
);
有关身份服务器DI https://identityserver.github.io/Documentation/docsv2/advanced/di.html
的更多详细信息,请参阅以下内容更新1
阅读更新后,我认为您尚未使用asp.net身份配置身份服务器。 AFAIK你不能用标识服务器插入现有的ApplicationUserManager。您必须创建自定义用户服务,您可以在其中插入任何用户管理系统。最常见的自定义用户服务实现是
使用第一个实现(即AspNetIdentity),您应该能够设置身份服务器以使用现有的用户数据库和现有的ApplicationUser
相关类。