web-dev-qa-db-ja.com

ASP.NET Core IdentityはUserManager <ApplicationUser>を挿入しません

古いasp.netコアアイデンティティデータベースがあり、新しいプロジェクト(Web API)をそれにマッピングしたい。

テストのために、ModelsフォルダーとApplicationUserファイルを前のプロジェクトからコピーしました(ApplicationUserはIdentityUserから継承するだけで、変更は一切ありません)-最初にDBを実行するのは悪い考えのようです。

ConfigureServicesにIdentityを登録しています(ただし、UserStoreを使用することが唯一の目的であるため、パイプラインに追加しません)

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

私の期待は今

     UserManager<ApplicationUser>

...コンストラクタに自動的に注入される必要があります。

ただし、次のコードをコントローラープライベートUserManager _userManagerに追加する場合、

    public UserController(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }

... APIへのすべての呼び出しは例外で終了します:HttpRequestException:応答ステータスコードは成功を示しません:500(内部サーバーエラー)。

「インジェクション」コードを削除すると、リクエストを受け入れることができるWeb APIがスムーズに実行されます。

これは、コードに到達する前に発生するため、デバッグが困難です。なぜこれが起こっているのか考えていますか?

追伸例外設定ウィンドウからすべての例外を有効にした後、私はこれを手に入れました:

スローされる例外: 'System.InvalidOperationException' in
Microsoft.Extensions.DependencyInjection.dll

追加情報:「Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4 [Namespace.Models。」をアクティブにしようとしたときに、「Namespace.Data.ApplicationDbContext」タイプのサービスを解決できません。 ApplicationUser、Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole、Namespace.Data.ApplicationDbContext、System.String] '。

9
nikovn

Configureメソッドにapp.UseIdentity();呼び出しがありますか?

_ public void Configure(IApplicationBuilder app, 
                       IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        /*...*/
        app.UseIdentity();
       /*...*/          
    }
_

[〜#〜] edit [〜#〜]services.AddIdentity<ApplicationUser, IdentityRole>()行の前にこの行もありますか?

_ public void ConfigureServices(IServiceCollection services)
 {
        // Add framework services.
        services.AddDbContext<ApplicationDbContext>(options =>
             options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

 }
_

これでうまくいくはずです。 ApplicationDbContextIdentityDbContextを継承しているかどうかも確認してください。

9

DIコンテナーは依存関係を解決できません。サービスコレクションに追加する

services.AddTransient<UserManager<ApplicationUser>>();
services.AddTransient<ApplicationDbContext>();

また、 公式ドキュメント に精通する必要があります。

4
Nkosi
public void ConfigureServices(IServiceCollection services){
...
var identityBuilder = services.AddIdentityCore<ApplicationUser>(user =>
            {
                // configure identity options
                user.Password.RequireDigit = true;
                user.Password.RequireLowercase = false;
                user.Password.RequireUppercase = false;
                user.Password.RequireNonAlphanumeric = false;
                user.Password.RequiredLength = 6;
            });
            identityBuilder = new IdentityBuilder(identityBuilder.UserType, typeof(IdentityRole), identityBuilder.Services);
            identityBuilder.AddEntityFrameworkStores<DbContext>().AddDefaultTokenProviders();
    ...
}
0
Lakmal