古い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] '。
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")));
}
_
これでうまくいくはずです。 ApplicationDbContext
がIdentityDbContext
を継承しているかどうかも確認してください。
DIコンテナーは依存関係を解決できません。サービスコレクションに追加する
services.AddTransient<UserManager<ApplicationUser>>();
services.AddTransient<ApplicationDbContext>();
また、 公式ドキュメント に精通する必要があります。
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();
...
}