如何在简单的类中访问DataProtectionProvider?

时间:2015-05-05 18:49:05

标签: asp.net-identity-2

我正在使用ASP.NET Identity 2.0。

在我的业务层(一个单独的DLL)中,我使用UserManager执行CreateUser或DeleteUser等简单任务。

 protected UserManager<User> UserManager
    {
        get
        {
            if (_userManager == null)
            {
                _userManager = new UserManager<User>(UserStore);
            }

            _userManager.UserValidator = new UserValidator<User>(_userManager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };

            return _userManager;
        }
    }

到目前为止,一切都很好。

现在我想生成电子邮件确认令牌:

public string GenerateEmailConfirmationToken(User user)
    {
        if (user == null)
            return null;

        return UserManager.GenerateEmailConfirmationToken(user.Id);
    }

上述代码在运行时失败,因为我的UserManager缺少DataProtectionProvider。

我的问题:我不知道如何将DataProtectionProvider添加到我的UserManager。

在MVC Web项目中,这是一项简单的任务(代码取自IdentityConfig.cs):

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore<User>(context.Get<ApplicationDbContext>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<User>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };

        // Configure validation logic for passwords
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = false,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };

        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = 
                new DataProtectorTokenProvider<User>(dataProtectionProvider.Create("semperplus"));
        }

        return manager;
    }

但我的业务逻辑中的UserManger不知道我的Web项目中的UserManager。我想我可以将我的web项目的UserManager传递给我的业务层,但我也有其他一些客户端项目(它们不是基于Web的)。所以,我宁愿采用另一种方式:在业务层中创建一个UserManager,让所有其他项目使用这个。

有人知道如何在我的业务层项目中创建DataProtectionProvider吗?

0 个答案:

没有答案