如何设置标识工厂选项<AppIdentityUserManager>选项?



如果您使用过Identity 2.0,就会看到这段代码:

       public static AppIdentityUserManager Create(
            IdentityFactoryOptions<AppIdentityUserManager> options,
            IOwinContext context)
        {
          [snip]
           var dataProtectionProvider = options.DataProtectionProvider;
            if (dataProtectionProvider != null)
            {
                manager.UserTokenProvider =
                    new DataProtectorTokenProvider<AppIdentityUser>(
                        dataProtectionProvider.Create("ASP.NET Identity"));
            }
            return manager;
        }

我明白。在我的应用程序选项。DataProtectionProvider(显然是作为参数传入的)为空。它是如何设置的,在哪里设置的(或者不是根据具体情况设置的?)我看过的每个地方都有确切的代码片段,但没有解释设置DataProtectionProvider。

编辑:我在身份样本项目中读取DataProtectionProvider,这解释了UserTokenProvider是什么,但没有解释它如何在IdentityFactoryOptions对象中设置。

在创建用户管理器时设置。

如果你在你的OWIN Startup类中使用CreatePerOwinContext方法,这是在Microsoft.AspNet.Identity.Owin中定义的扩展,该扩展创建一个新的IdentityFactoryOption对象并将其传递给CreatePerOwinContext的参数Func

您可以在源代码中看到CreatePerOwinContext的详细信息。

public static IAppBuilder CreatePerOwinContext<T>(this IAppBuilder app,
    Func<IdentityFactoryOptions<T>, IOwinContext, T> createCallback,
    Action<IdentityFactoryOptions<T>, T> disposeCallback) where T : class, IDisposable
{
    if (app == null)
    {
        throw new ArgumentNullException("app");
    }
    if (createCallback == null)
    {
        throw new ArgumentNullException("createCallback");
    }
    if (disposeCallback == null)
    {
        throw new ArgumentNullException("disposeCallback");
    }
    app.Use(typeof (IdentityFactoryMiddleware<T, IdentityFactoryOptions<T>>),
        new IdentityFactoryOptions<T>
        {
            DataProtectionProvider = app.GetDataProtectionProvider(),
            Provider = new IdentityFactoryProvider<T>
            {
                OnCreate = createCallback,
                OnDispose = disposeCallback
            }
        });
    return app;
}

注意,如果你在你的应用程序中有自己的DI机制,你不需要使用CreatePerOwinContext方法并自己连接所有对象的创建。这样你甚至不需要任何IdentityFactoryOptions。您可以通过您喜欢的任何类型的DI注入IUserStore, DbContext, IDataProtectionProvider和其他任何您需要的内容。

相关内容

  • 没有找到相关文章

最新更新