将nInject iscuredataformat绑定到autoFac



我正在将大型代码库从ninject迁移到autoFac,并在我认为基于我的某些调试的一种绑定上挣扎。

ninject:

Bind<ISecureDataFormat<AuthenticationTicket>>()
     .ToMethod(context =>
         {
             var owinContext = context.Kernel.Get<IOwinContext>();
             return owinContext
                    .Get<ISecureDataFormat<AuthenticationTicket>>("SecureDataFormat");
         });

autoFac(我拥有的(:

builder.Register(
    context => context.Resolve<IOwinContext>()
        .Get<ISecureDataFormat<AuthenticationTicket>>("SecureDataFormat"))
        .As<ISecureDataFormat<AuthenticationTicket>>();

startup.cs:

var container = RegisterIoC(app, config);
public IContainer RegisterIoC(IAppBuilder app, HttpConfiguration config)
    {
        var builder = new ContainerBuilder();
        builder = RegisterDependencies(builder);
        builder = RegisterFilters(builder, config);
        /*builder.RegisterModule<DebuggingRequestModule>();*/
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        app.UseAutofacMiddleware(container);
        app.UseAutofacMvc();
        app.UseAutofacWebApi(config);
        app.UseWebApi(config);
        return container;
    }

更多:

builder.RegisterModule<ApiDependencyModule>().RegisterModule<AutofacWebTypesModule>();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterApiControllers(typeof(AccountController).Assembly);

(看似(关联的构造函数:

AccountController.cs:

public AccountController(ILoginService loginService,
                             IBearerTokenStore tokenStore,
                             IRememberMeCookieService rememberMeCookieService,
                             IInternalSsoChallenge ssoChallenge)
{
}

loginservice.cs:

public LoginService(IBearerTokenStore tokenStore, 
        IGrantTypeProvider grantProvider, 
        IRememberMeCookieService rememberMeCookieService)
{
}

bearertokencookiestore.cs:

public BearerTokenCookieStore(IOwinContext owinContext, ISecureDataFormat<AuthenticationTicket> secureDataFormat, IAppSettingsReader appSettingsReader, ICookieService cookieService)
{
}

我有一个可帮助我调试的记录模块,这是我拥有的消息列表:

Resolving  _______.Login.Controllers.AccountController
--Resolving  _______.ApiGateway.Services.Auth.LoginService
----Resolving  _______.ApiGateway.Security.OAuth.BearerTokenCookieStore
------Resolving  Microsoft.Owin.Security.DataHandler.SecureDataFormat`1[Microsoft.Owin.Security.AuthenticationTicket]
Exception thrown: 'Autofac.Core.DependencyResolutionException' in Autofac.dll
Exception thrown: 'Autofac.Core.DependencyResolutionException' in Autofac.dll
Exception thrown: 'Autofac.Core.DependencyResolutionException' in Autofac.dll
The thread 0x1014 has exited with code 0 (0x0).

编辑:

我看到的例外:

An error occurred during the activation of a particular registration.
See the inner exception for details. Registration: 
Activator = AccountController (DelegateActivator), 
Services = [____.Login.Controllers.AccountController], 
Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, 
Sharing = None, 
Ownership = ExternallyOwned ---> 
An error occurred during the activation of a particular registration. 
See the inner exception for details. 
Registration: 
Activator = AccountController (ReflectionActivator), 
Services = [____.Login.Controllers.AccountController], 
Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, 
Sharing = None, Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. 
See the inner exception for details. 
Registration: 
Activator = LoginService (DelegateActivator), 
    Services = [____.ApiGateway.Services.Auth.ILoginService],
Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,
Sharing = None,
Ownership = ExternallyOwned ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = LoginService (ReflectionActivator),
Services = [____.ApiGateway.Services.Auth.ILoginService],
Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,
Sharing = None,
Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = BearerTokenCookieStore (DelegateActivator),
Services = [____.ApiGateway.Security.OAuth.IBearerTokenStore],
Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,
Sharing = None,
Ownership = ExternallyOwned ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = BearerTokenCookieStore (ReflectionActivator),
Services = [____.ApiGateway.Security.OAuth.IBearerTokenStore],
Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,
Sharing = Shared,
Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = ISecureDataFormat`1 (DelegateActivator),
Services = [Microsoft.Owin.Security.ISecureDataFormat`1[[Microsoft.Owin.Security.AuthenticationTicket,
Microsoft.Owin.Security,
Version=3.0.1.0,
Culture=neutral,
PublicKeyToken=31bf3856ad364e35]]],
Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,
Sharing = None,
Ownership = ExternallyOwned ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = ISecureDataFormat`1 (DelegateActivator),
Services = [Microsoft.Owin.Security.ISecureDataFormat`1[[Microsoft.Owin.Security.AuthenticationTicket,
Microsoft.Owin.Security,
Version=3.0.1.0,
Culture=neutral,
PublicKeyToken=31bf3856ad364e35]]],
Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,
Sharing = None,
Ownership = OwnedByLifetimeScope ---> A delegate registered to create instances of 'Microsoft.Owin.Security.ISecureDataFormat`1[Microsoft.Owin.Security.AuthenticationTicket]' returned null. (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.)

最内部:

A delegate registered to create instances of 'Microsoft.Owin.Security.ISecureDataFormat`1[Microsoft.Owin.Security.AuthenticationTicket]' returned null.

从ninject到autoFac的迁移似乎是正确的,但是 ISecureDataFormat<AuthenticationTicket>接口的绑定可能无法正常工作,导致某些依赖项的激活误差。基于调试消息,BearerTokenCookieStore类无法解决此依赖关系。

在Ninject版本中,ISecureDataFormat<AuthenticationTicket>绑定到检索IOwinContext实例的方法,并使用它来解析ISecureDataFormat<AuthenticationTicket>命名为" SecuredataFormat。"。但是,在AUTOFAC版本中,ISecureDataFormat<AuthenticationTicket>实例是使用IOwinContext实例直接解决的,但没有提供名称。

可能在AutoFac容器中未正确注册ISecureDataFormat<AuthenticationTicket>。要解决此问题,您可以尝试使用命名扩展方法明确注册命名实例:

builder.Register(context =>
context.Resolve<IOwinContext>()
    .Get<ISecureDataFormat<AuthenticationTicket>>("SecureDataFormat"))
    .Named<ISecureDataFormat<AuthenticationTicket>>("SecureDataFormat");
builder.Register(context =>
    context.ResolveNamed<ISecureDataFormat<AuthenticationTicket>>("SecureDataFormat"))
    .As<ISecureDataFormat<AuthenticationTicket>>();

然后,在BearerTokenCookieStore构造函数中,您可以解决这样的命名实例:

public BearerTokenCookieStore(
    IOwinContext owinContext,
    [Named("SecureDataFormat")] ISecureDataFormat<AuthenticationTicket> secureDataFormat,
    IAppSettingsReader appSettingsReader,
    ICookieService cookieService)
{ }

这应该确保BearerTokenCookieStore类正确解析ISecureDataFormat<AuthenticationTicket>名为"SecureDataFormat"的CC_12,并且需要其他需要它的依赖项使用。

我们可以将autoFac与control的那些c#owin倒置( ninject to autoFac (一样,如下

startup.cs

public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            WebApiConfig.Register(config);    
            ConfigureIoC(app, config);
            Components.Config();
            Auth.ConfigureForApi(app);
            app.UseAutofacWebApi(config);
            app.UseCors(CorsOptions.AllowAll);
            app.UseWebApi(config);
            config.EnsureInitialized();
        }
        private void ConfigureIoC(IAppBuilder app, HttpConfiguration config)
        {
            IoC.RegisterModules(
                builder =>
                {
                    builder.Register<IAuthenticationManager>(c => c.Resolve<IOwinContext>().Authentication).InstancePerRequest();
                    builder.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).InstancePerRequest();
                    builder.RegisterApiControllers(typeof(Startup).Assembly).PropertiesAutowired();
                },
                container =>
                {
                    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
                    app.UseAutofacMiddleware(container);
                },
                true
                );
        }
    }

webapiconfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

组件配置:

public static class Components
{
    public static void Config() {
        TypeAdapterConfig.GlobalSettings.AllowImplicitDestinationInheritance = true;
        var registers = new List<IRegister>();
        registers.Add(new DtoMapping());
        registers.Add(new MappingRegistration());
        TypeAdapterConfig.GlobalSettings.Apply(registers);
        ObjectMapper.Current = new MapsterAdapter();
        DbConfiguration.Loaded += DbConfiguration_Loaded;
        var r = new Registrations();
        r.Run();
    }

    private static void DbConfiguration_Loaded(object sender, System.Data.Entity.Infrastructure.DependencyResolution.DbConfigurationLoadedEventArgs e)
    {
        e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
}

身份验证:

public class Auth
    {
        public static void ConfigureForMvc(IAppBuilder app)
        {
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, UserEntity, int>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentityCallback: (manager, user) =>
                        user.GenerateUserIdentityAsync(manager, DefaultAuthenticationTypes.ApplicationCookie),
                        getUserIdCallback: (Identity) => Identity.GetUserId<int>())
                }
            });
        }
        public static void ConfigureForApi(IAppBuilder app)
        {
            var OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/oauth2/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(120),
                Provider = new CustomOAuthProvider(),
                AccessTokenFormat = new CustomJwtFormat(ConfigConstants.Issuer)
            };
            app.UseOAuthAuthorizationServer(OAuthServerOptions);
            app.UseJwtBearerAuthentication(
                new JwtBearerAuthenticationOptions
                {
                    AuthenticationMode = AuthenticationMode.Active,
                    AllowedAudiences = new[] { ConfigConstants.AudienceId },
                    IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                    {
                        new SymmetricKeyIssuerSecurityTokenProvider(ConfigConstants.Issuer, ConfigConstants.AudienceSecurityKey)
                    }
                });
        }
    }

Program.cs

builder.Host.ConfigureContainer<ContainerBuilder>(builder => builder.RegisterModule(new AutofacBusinessModule()));

AutoMapperProfil.cs

namespace BusinessKatman.AutoMappers
{
    public class AutoMapperProfil : Profile
    {
        public AutoMapperProfil()
        {
            CreateMap<PageVM, Page>().ReverseMap();
 }
    }
}

Controllers

private readonly IMapper _mapper;
 public AutoIllerManager(IMapper mapper)
        {            
            _mapper = mapper;
        }
 public IActionResult GetPageDetail
{
var p = _mapper.Map<PageVM>(result);
//and
var p = _mapper.Map<Page>(result);
// list
var p = _mapper.Map<List<Page>>(result);
}

最新更新