如何向IdentityServerServiceFactory注册UserManager?

时间:2016-07-29 04:27:02

标签: asp.net-identity identityserver3

我使用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.AdminIdentityManager

3&gt; 客户端门户:此应用程序可供最终用户访问,用户可以在其中重置密码,更改密码。这是标准的VS ASP.NET MVC5应用程序。

所有3个应用程序共享相同的实体,例如ApplicationUserApplicationUserStoreApplicationDbContextApplicationRoleApplicationUserManager等。

我关注ApplicationUserManagerEmailServiceUserTokenProviderPasswordValidator通过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?

1 个答案:

答案 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。您必须创建自定义用户服务,您可以在其中插入任何用户管理系统。最常见的自定义用户服务实现是

  1. ASP.NET身份 - (Implementation) - (Usage
  2. 会员资格重新启动 - (Implementation) - (Usage
  3. 使用第一个实现(即AspNetIdentity),您应该能够设置身份服务器以使用现有的用户数据库和现有的ApplicationUser相关类。