私は現在の認証プロセスを置き換えることを希望して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のを割り当てるための正しい方法です:
だから、私は質問のカップルを持っていますか?
- これにより、既存のユーザーは認証できますか?
- 誰もこれを前にしましたか?もしそうなら、彼らはそれを働かせるようにしましたか?
誰でも私がこれらの質問に私を助けることができれば、私は永遠に感謝しています。