如果您使用过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;
}
我理解。在我的应用程序中,options.DataProtectionProvider(显然作为参数传入)为null。该集合的方式和位置(或不是这样的情况?)我看过的每个地方都有完整的代码片段,但没有解释设置DataProtectionProvider。
编辑:我读了DataProtectionProvider in the Identity sample project,它解释了UserTokenProvider是什么,但没有解释它是如何在IdentityFactoryOptions对象中设置的。
答案 0 :(得分:4)
创建用户管理器时设置。
如果您在OWIN CreatePerOwinContext
类中使用Startup
方法,该类是Microsoft.AspNet.Identity.Owin
中定义的扩展名,则该扩展程序会创建一个新的IdentityFactoryOption
对象并将其传递给Func
的参数CreatePerOwinContext
。
您可以在the source code here中查看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
以及其他任何其他内容。