通过AUTOFAC 4.0配置Oauthauthorizationerserververververder



我必须将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,访问会话,访问缓存等等...因此它不能是单身人士。

我需要每个请求的寿命。所以这里的问题..我的配置中存在两个问题。

  1. 我在SingleInstance对象内有一个InstancePerRequest对象。我不能这样做。故障排除每个要求依赖关系

  2. 当我在启动中配置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);解决这些其他属性。

您可以提供有关要观察到的错误或错误消息的具体详细信息?

相关内容

  • 没有找到相关文章