IdentityFactoryOptions <AppIdentityUserManager>选项如何设置?

Dus*_*ton 13 c# asp.net-mvc asp.net-identity

如果您使用过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;
        }
Run Code Online (Sandbox Code Playgroud)

我明白那个.在我的应用程序中,options.DataProtectionProvider(显然作为参数传入)为null.该集合的方式和位置(或不是这样的情况?)我看过的每个地方都有完整的代码片段,但没有解释设置DataProtectionProvider.

编辑:我在Identity示例项目中读取了DataProtectionProvider,它解释了UserTokenProvider是什么,但没有解释它是如何在IdentityFactoryOptions对象中设置的.

Tom*_*rek 5

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

如果您使用的是CreatePerOwinContextOWIN Startup类内部的方法(是在中定义的扩展)Microsoft.AspNet.Identity.Owin,则该扩展会创建一个新IdentityFactoryOption对象,并将其传递给Func的参数CreatePerOwinContext

您可以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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的应用程序中有自己的DI机制,则无需使用该CreatePerOwinContext方法并自行创建所有对象。这样,您甚至不需要任何东西IdentityFactoryOptions。你可以只注射IUserStoreDbContextIDataProtectionProvider,和其他任何你通过任何一种DI的你喜欢的需要。