我必须将OAuth与AutoFac集成。但是出了点问题。我想我明白了为什么,但是我不知道该如何解决。我让你看到我的代码。
我的autoFac config
{
builder.RegisterType<CustomAuthorizationServerProvider>()
.PropertiesAutowired()
.SingleInstance();
builder.RegisterType<MyBusinessObj>()
.As<IMyBusinessObj>()
.InstancePerRequest()
.PropertiesAutowired();
//IMySessionObj is a prop inside MyBusinessObj
builder.RegisterType<MySessionObj>()
.As<IMySessionObj>()
.InstancePerRequest()
.PropertiesAutowired();
//IMyUnitOfWorkObjis a prop inside MyBusinessObj
builder.RegisterType<MyUnitOfWorkObj>()
.As<IMyUnitOfWorkObj>()
.InstancePerRequest();
...
}
startup.cs
我有经典配置加上我的authorizationServerProvider
的分辨率。
app.UseAutofacMiddleware(_container);
app.UseAutofacWebApi(config);
var oauthServerOptions = new OAuthAuthorizationServerOptions
{
...,
Provider = _container.Resolve<CustomAuthorizationServerProvider>()
};
app.UseOAuthAuthorizationServer(oauthServerOptions);
app.UseWebApi(config);
customauthorizationserverprovider.cs
这就是我实现CustomAuthorizationServerProvider
的方式。
public class CustomAuthorizationServerProvider: OAuthAuthorizationServerProvider
{
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
var autofacLifetimeScope = OwinContextExtensions.GetAutofacLifetimeScope(context.OwinContext);
var myBusinessObj = autofacLifetimeScope.Resolve<IMyBusinessObj>();
var xxx = myBusinessObj.DoWork();
...
return Task.FromResult<object>(null);
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var myBusinessObj = autofacLifetimeScope.Resolve<IMyBusinessObj>();
var xxx = myBusinessObj.DoWork();
...
context.Validated(ticket);
}
}
在这里,我在终生尺寸中求解我的IMyBusinessObj
,而不是在容器中。该对象负责(间接)连接到DB,访问会话,访问缓存等等...因此它不能是单身人士。
我需要每个请求的寿命。所以这里的问题..我的配置中存在两个问题。
我在
SingleInstance
对象内有一个InstancePerRequest
对象。我不能这样做。故障排除每个要求依赖关系当我在启动中配置OAuth时,我实际上无法具有
InstancePerRequest
对象...因为在此上下文中还不存在请求。
所以..我知道这是我的问题。
有什么想法或技巧吗?谢谢
我遇到一个非常相似的问题,即使不是一样。我能够通过以下内容来解决它:
1。请勿直接从容器中解析IOAuthAuthorizationServerProvider
。而是使用IDependencyResolver
。在您的示例中:
var oauthServerOptions = new OAuthAuthorizationServerOptions
{
...,
Provider = (IOAuthAuthorizationServerProvider)resolver.GetService(typeof(IOAuthAuthorizationServerProvider)),
};
这要求您正确配置HttpConfiguration.DependencyResolver
:
HttpConfiguration config = new HttpConfiguration();
... // Configure unrelated
var builder = new ContainerBuilder();
... // set Autofac registrations
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
// THIS is where you configure OAuthAuthorizationServerOptions, using IDependencyResolver to resolve IOAuthorizationServerProvider instead of IContainer
ConfigureAuth(app, config.DependencyResolver);
2。我正在使用动态装配扫描来配置某些AUTOFAC模块注册。我无意间正在扫描以"提供者"结尾的课程,并将其注册为RequestPerInstance()
。这对我来说是一个问题,因为它正在将我的IOAuthAuthorizationServerProvider
重新注册为每次重新要求的实例,该实例无法在Startup()
代码期间解决。
我用单个注册替换的问题代码:
builder.RegisterAssemblyTypes(executingAssembly)
.Where(t => t.Name.EndsWith("Provider"))
.AsImplementedInterfaces()
.InstancePerRequest();
3。检查MySessionObj
的属性,并查看AUTOFAC正在解决的依赖项(如果有)。确保您将依赖项明确注册为InstancePerRequest()
。
通过使用OwinContextExtensions.GetAutofacLifetimeScope(context.OwinContext);
,您将依赖关系解析为" autofacwebrequest"寿命范围,而不是根部范围。结果,我的理解是在请求结束后应处理依赖性依赖性,并且不应引起您的应用程序问题。
4。我不确定您的CustomAuthorizationServerProvider
对象正在自动自动属性,但是假设您没有发布此类的完整代码样本,我会尝试从其AutoFac注册中删除PropertiesAutowired()
如果可能的话,对象内部继续使用OwinContextExtensions.GetAutofacLifetimeScope(context.OwinContext);
解决这些其他属性。
您可以提供有关要观察到的错误或错误消息的具体详细信息?