IdentityServer3与autofac

时间:2017-08-31 12:33:47

标签: c# autofac identityserver3

我正在尝试将IdentityServer3实现到使用Autofac的现有项目中。我遇到的问题是,当我设置自定义服务时,如果我运行我的项目并尝试进行身份验证,我会收到此错误:

  

"尝试创建类型为' TokenEndpointController'的控制器时发生错误。确保控制器具有无参数的公共构造函数。"

现在我知道当服务设置不正确时,这是一个通用的autofac错误。 该错误实际上是关于我的自定义 UserService 声明:

  

没有任何构造函数与' Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type' Business.IdentityServer.IdentityServerUserService'可以使用可用的服务和参数调用:   无法解析参数' Business.Providers.IUserProvider userProvider'构造函数' Void .ctor(Business.Providers.IUserProvider)'。

在我开始使用IdentityServer3之前,我已经有了一个 UserProvider ,并且它是在autofac中设置的,如下所示:

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

之前有效,所以我知道 UserProvider 确实拥有它的所有依赖关系。

我的UserService看起来像这样:

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>());
        }
    }
}

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这是由于我如何配置工厂。我现在有这样的话:

    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;
    }

我的用户服务仍然相同,所以一切正常。