Asp.net web api 将ApplicationUserManager传递给具有ASP.Net标识的Autofac的ApplicationAuthProvider

Asp.net web api 将ApplicationUserManager传递给具有ASP.Net标识的Autofac的ApplicationAuthProvider,asp.net-web-api,dependency-injection,inversion-of-control,autofac,asp.net-identity-2,Asp.net Web Api,Dependency Injection,Inversion Of Control,Autofac,Asp.net Identity 2,我正在使用ASP.Net Identity,并希望通过本文将ApplicationUserManager服务添加到我的所有自定义控制器中: 这在我的控制器中非常有效,但当我试图在API上调用localhost:xxxx/token来创建令牌时就不行了。下面是调用的方法,但是context.OwinContext.GetUserManager返回null 我已尝试将ApplicationUserManager注入ApplicationAuthProvider,但未能成功。你能给我指一下正确的方向吗

我正在使用ASP.Net Identity,并希望通过本文将
ApplicationUserManager
服务添加到我的所有自定义控制器中:

这在我的控制器中非常有效,但当我试图在API上调用localhost:xxxx/token来创建令牌时就不行了。下面是调用的方法,但是
context.OwinContext.GetUserManager
返回null

我已尝试将
ApplicationUserManager
注入
ApplicationAuthProvider
,但未能成功。你能给我指一下正确的方向吗

编辑:10/15

好的,我已经做得更进一步了,但是我仍然被卡住了。我能够用以下方法初始化这些类:

var x=newdatabasecontext();
var-store=新用户存储(x);
var options=new IdentityFactoryOptions()
{
DataProtectionProvider=新的Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider(“应用程序名称”)
};
寄存器(c=>x);
builder.Register(c=>store).AsImplementedInterfaces();
注册器(c=>选项);
RegisterType();
注册(c=>newapplicationauthProvider(“self”,newapplicationUserManager(store,options))).As();
这允许我将
ApplicationUserManager
传递到我的
ApplicationAuthProvider
的构造函数中。在
Startup.Auth
配置中,我使用以下命令初始化提供程序:

OAuthOptions=新的OAuthorizationServerOptions
{
TokenEndpointPath=新路径字符串(“/Token”),
Provider=(IOAuthAuthorizationServerProvider)全局配置.Configuration.DependencyResolver.GetService(类型为(IOAuthAuthorizationServerProvider)),
AuthorizeEndpointPath=新路径字符串(“/api/Account/ExternalLogin”),
AccessTokenExpireTimeSpan=TimeSpan.FromDays(14),
AllowInsecureHttp=true
};
这让我更接近一个解决方案,但仍然有两个问题

第一个是在API上调用/token时,
userManager.FindAsync(context.UserName,context.Password)
返回空值,但
userManager.findbyemailsync(context.UserName)
返回正确的用户。我最初的想法是密码是错误的,但我确定它与我注册的密码相同

第二个问题是,如果我调用AccountController上的register,然后调用/token,我会得到一个无法访问已处理对象的错误。对象名称:“UserStore”错误。因此,我假设这意味着我没有在引导程序文件中正确初始化
ApplicationAuthProvider


任何指导都将不胜感激。谢谢

我终于找到了解决办法 第一个解决方案: 第一:更改引导autofac类 您应该添加singleInstance();为避免每请求依赖项错误[没有标记与“AutofacWebRequest”匹配的作用域]

builder.RegisterType().AsSelf().SingleInstance();
注册(c=>newidentityfactoryoptions(){DataProtectionProvider=new DpapiDataProtectionProvider(“您的应用程序名”)});
builder.RegisterType().AsSelf().SingleInstance();
//解决applicationUserManager问题的步骤
Register(c=>newapplicationAuthProvider(c.Resolve()).AsImplementedInterfaces().SingleInstance();
Register(c=>newuserstore(c.Resolve()).AsImplementedInterfaces().SingleInstance();
Register(c=>HttpContext.Current.GetOwinContext().Authentication).As();
第二:在Startup.cs中 将删除GlobalConfiguration.configuration.DependencyResolver,因为其始终为null。。所以我将使用autofac容器解析器,但应该从lifetimescope使用它,该容器是从引导autofac配置方法返回的

OAuthOptions=新的OAuthorizationServerOptions
{
TokenEndpointPath=新路径字符串(“/Token”),
Provider=container.BeginLifetimeScope().Resolve(),
AuthorizeEndpointPath=新路径字符串(“/api/Account/ExternalLogin”),
AccessTokenExpireTimeSpan=TimeSpan.FromDays(14),
AllowInsecureHttp=true
};
第三:在您的应用程序中,AuthProvider类将添加构造函数,并将applicationUserManager作为参数

这修复了我在谷歌搜索两天后出现的空错误,但找不到答案,希望能有所帮助

第二种解决方案:因为SingleInstance()不适合企业应用程序,所以可以使用InstancePerRequest()适用于所有注册表类型

builder.RegisterType().AsSelf().InstancePerRequest();
注册(c=>newidentityfactoryoptions(){DataProtectionProvider=new DpapiDataProtectionProvider(“您的应用程序名”)});
builder.RegisterType().AsSelf().InstancePerRequest();
//解决applicationUserManager问题的步骤
注册(c=>new ApplicationAuthProvider(c.Resolve()).AsImplementedInterfaces().InstancePerRequest();
Register(c=>newuserstore(c.Resolve()).AsImplementedInterfaces().InstancePerRequest();
Register(c=>HttpContext.Current.GetOwinContext().Authentication).As();
在Startup.cs中

OAuthOptions=新的OAuthorizationServerOptions
{
TokenEndpointPath=新路径字符串(“/Token”),
//将实例化新实例以避免单个实例进行解析
Provider=新的CustomOAuthProvider(新的ApplicationUserManager(新的UserStore)(新的DataContext()),
AuthorizeEndpointPath=新路径字符串(“/api/Account/ExternalLogin”),
AccessTokenExpireTimeSpan=TimeSpan.FromDays(14),
AllowInsecureHttp=true
};
CustomOAuthProvider类

使用Microsoft.AspNet.Identity.Owin;
使用Microsoft.Owin.Security;
使用Microsoft.Owin