gpt4 book ai didi

oauth-2.0 - 通过 Autofac 4.0 配置 OAuthAuthorizationServerProvider

转载 作者:行者123 更新时间:2023-12-03 11:49:18 27 4
gpt4 key购买 nike

我必须将 Oauth 与 Autofac 集成。但是出了点问题。我想我明白为什么,但我不知道如何解决。我让你看看我的代码。

我的 Autofac 配置

{
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,而不是在容器中。该对象负责(间接地)连接到数据库、访问 session 、访问缓存等等...所以它不能是单例。

我需要每个请求都有一个生命周期。所以这里的问题.. 我的配置中有两个问题。

  1. 我在 SingleInstance 对象中有一个 InstancePerRequest 对象。我不能这样做。 Troubleshooting Per-Request Dependencies

  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 模块注册。我无意中扫描了以“Provider”结尾的类并将它们注册为 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 对象 Autowiring 了哪些属性,但假设您没有发布此类的完整代码示例,我会尝试从它的 Autofac 注册中删除 PropertiesAutowired() 并在对象内部继续使用 OwinContextExtensions.GetAutofacLifetimeScope(context.OwinContext); 如果可能的话解析这些其他属性。

您能否提供有关您观察到的错误或错误消息的具体细节?

关于oauth-2.0 - 通过 Autofac 4.0 配置 OAuthAuthorizationServerProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47488127/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com