1

私は現在の認証プロセスを置き換えることを希望してIdentityServer3で遊んでいます。 現在、私たちはコード第1エンティティフレームワークを使用してカスタムアイデンティティフレームワークプロセスを使用しています。 私はIdentityServer3をインストールし、「メモリ内」の作業を行うことができました。今私はすでにカスタマイズされたUserProvider(あなたが好きな場合はUserManager)に接続したいと思います。IdentityServer3、Autofac、既存のプロジェクトのIdentityFramework

我々はすでにAutofacを使用して私たちのUserProviderは次のように登録されてい:

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

私はそのIdentityServer uses Autofac自体を述べたいくつかのドキュメントを見つけました。彼らは工場を作成し、このようなユーザサービス登録するIdentityServerOptionsを使用することをお勧めし :使用している

public class UserServiceFactory 
{ 
    public static AspNetIdentityUserService<User, string> Create() 
    { 
     var context = new IdentityDbContext(); 
     var userStore = new UserStore<User>(context); 
     var userManager = new UserManager<User>(userStore); 

     return new AspNetIdentityUserService<User, string>(userManager); 
    } 
} 

:私はそれを持っている

options.Factory.UserService = new Registration<IUserService>(UserServiceFactory.Create()) 

問題は、工場では、次のようになります通常のUserManagerではなく、カスタマイズされたバージョンです。静的メソッドですべてを作成するため、DIを使用していません。 確かに、私たちはすでにユーザープロバイダを登録しているので、Autofacを使う方が良いでしょう。 したがって、IdentityServerOptionsを使用して静的メソッドを呼び出すことはありませんでした。だから私は、これまで私の工場を変えた:私はこのようなautofacに登録

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

どちら:

builder.RegisterType<IdentityServerUserService>() 
     .As<IdentityServer3.Core.Services.IUserService>() 
     .InstancePerDependency(); 

そして私はこのようなIdentityServerOptions.Factory.UserServiceに割り当てられている:

private static void SetupServices(IdentityServerOptions options, ILifetimeScope scope) 
{ 
    options.Factory.UserService = new Registration<IUserService>(scope.Resolve<IdentityServerUserService>()); 
} 

と範囲私はこのようになる:

var config = new HttpConfiguration(); 
var scope = config.DependencyResolver.GetRootLifetimeScope(); 

私は、これは動作するはずと信じて、私は認証するために郵便配達を使用しようとすると、私はエラーを取得する:

Autofac.Core.Registration.ComponentNotRegisteredException:要求されたサービス「Business.IdentityServerUserServiceは、」登録されていません。この例外を回避するには、サービスを提供するコンポーネントを登録するか、IsRegistered()を使用してサービス登録を確認するか、ResolveOptional()メソッドを使用してオプションの依存関係を解決します。

InstancePerDependencyからInstancePerLifetimeScopeに変更しようとしましたが、同じエラーが発生しました。

  • これはUserServiceのを割り当てるための正しい方法です:

    だから、私は質問のカップルを持っていますか?

  • これにより、既存のユーザーは認証できますか?
  • 誰もこれを前にしましたか?もしそうなら、彼らはそれを働かせるようにしましたか?

誰でも私がこれらの質問に私を助けることができれば、私は永遠に感謝しています。

答えて

1

IdentityServerUserServiceを解決しましたが、IdentityServerUserServiceIUserServiceと登録してください。 Autofacは自動的にタイプを自動的に登録しません。あなたは自分自身

builder.RegisterType<IdentityServerUserService>() 
     .As<IdentityServer3.Core.Services.IUserService>() 
     .InstancePerDependency(); 

またはIUserService

options.Factory.UserService = new Registration<IUserService>(scope.Resolve<IUserService>()) 
を解決するようなタイプを登録することができ、エラーを修正するには

関連する問題