2017-08-31 2 views
1

Ich versuche, IdentityServer3 in ein vorhandenes Projekt zu implementieren, das Autofac verwendet. Das Problem, das ich über gekommen bin, ist, dass, wenn ich meine benutzerdefinierten Dienste einrichten, wenn ich mein Projekt laufen und ich versuche, diesen Fehler zu authentifizieren erhalten:IdentityServer3 mit Autofac

"An error occurred when trying to create a controller of type 'TokenEndpointController'. Make sure that the controller has a parameterless public constructor."

Jetzt weiß ich, das ist ein allgemeiner Autofac Fehler, wenn ein Dienst hat nicht richtig eingerichtet. Der Fehler stöhnt eigentlich über meine Gewohnheit Userservice besagt:

None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Business.IdentityServer.IdentityServerUserService' can be invoked with the available services and parameters: Cannot resolve parameter 'Business.Providers.IUserProvider userProvider' of constructor 'Void .ctor(Business.Providers.IUserProvider)'.

Jetzt schon hatte ich einen UserProvider, bevor ich mit IdentityServer3 gestartet und es wurde in Autofac wie folgt aufgebaut:

builder.RegisterType<DatabaseContext>().As<DbContext>().InstancePerDependency(); 
builder.RegisterType<UserProvider>().As<IUserProvider>().InstancePerDependency(); 

Das funktionierte vorher, also weiß ich, dass der UserProvider tatsächlich alle Abhängigkeiten hat.

sieht Mein Userservice wie folgt aus:

public class IdentityServerUserService : UserServiceBase 
{ 
    private readonly IUserProvider _userProvider; 

    public IdentityServerUserService(IUserProvider userProvider) 
    { 
     _userProvider = userProvider; 
    } 

    public override async Task AuthenticateLocalAsync(LocalAuthenticationContext context) 
    { 
     var user = await _userProvider.FindAsync(context.UserName, context.Password); 

     if (user != null && !user.Disabled) 
     { 
      // Get the UserClaims 

      // Add the user to our context 
      context.AuthenticateResult = new AuthenticateResult(user.Id, user.UserName, new List<Claim>()); 
     } 
    } 
} 

Wer weiß, wie ich dieses Problem beheben kann?

Antwort

1

Dies war aufgrund der Konfiguration der Fabrik. Ich habe es jetzt so:

private static IdentityServerServiceFactory Configure(this IdentityServerServiceFactory factory, CormarConfig config) 
    { 
     var serviceOptions = new EntityFrameworkServiceOptions { ConnectionString = config.SqlConnectionString }; 
     factory.RegisterOperationalServices(serviceOptions); 
     factory.RegisterConfigurationServices(serviceOptions); 

     factory.CorsPolicyService = new Registration<ICorsPolicyService>(new DefaultCorsPolicyService { AllowAll = true }); // Allow all domains to access authentication 
     factory.Register<DbContext>(new Registration<DbContext>(dr => dr.ResolveFromAutofacOwinLifetimeScope<DbContext>())); 
     factory.UserService = new Registration<IUserService>(dr => dr.ResolveFromAutofacOwinLifetimeScope<IUserService>()); 
     factory.ClientStore = new Registration<IClientStore>(dr => dr.ResolveFromAutofacOwinLifetimeScope<IClientStore>()); 
     factory.ScopeStore = new Registration<IScopeStore>(dr => dr.ResolveFromAutofacOwinLifetimeScope<IScopeStore>()); 

     return factory; 
    } 

Mein Benutzer-Service ist immer noch der gleiche, so dass alles funktioniert.