'AuthController'をアクティブ化しようとしているときに、タイプ 'Microsoft.AspNetCore.Identity.UserManager`のサービスを解決できません


97

LoginControllerでこのエラーが発生します。

InvalidOperationException:「Automobile.Server.Controllers.AuthController」をアクティブ化しようとしているときに、タイプ「Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]」のサービスを解決できません。

これがAuthControllerコンストラクターです:

private SignInManager<Automobile.Models.Account> _signManager;
    private UserManager<Automobile.Models.Account> _userManager;

    public AuthController(UserManager<Models.Account> userManager,
                          SignInManager<Automobile.Models.Account> signManager)
    {
        this._userManager = userManager;
        this._signManager = signManager;
    }

これがstartup.csのConfigureServicesです。

public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);
        services.Configure<AppConfig>(Configuration.GetSection("AppSettings"));

        //var provider = HttpContext.ApplicationServices;
        //var someService = provider.GetService(typeof(ISomeService));


        services.AddDbContext<Providers.Database.EFProvider.DataContext>(options => options
            .UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
                 b => b.MigrationsAssembly("Automobile.Server")
            ));


        services.AddIdentity<IdentityUser, IdentityRole>(options =>
        {
            options.User.RequireUniqueEmail = false;
        })
        .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
        .AddDefaultTokenProviders(); 
        //services.AddScoped<SignInManager<Automobile.Models.Account>, SignInManager<Automobile.Models.Account>>();
        //services.AddScoped<UserManager<Automobile.Models.Account>, UserManager<Automobile.Models.Account>>();

        services.AddMvc();
        App.Service = services.BuildServiceProvider();

        // Adds a default in-memory implementation of IDistributedCache.
        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.CookieHttpOnly = true;
        });

    }

22
IdentityUser基本的なユーザークラスとして登録しているように見えますが、使用しています。Automobile.Models.Accountもちろん、ASP.NET Identityによってどこにも登録されていません
Federico Dipuma 2017年

@FedericoDipumaどうもありがとうございました:)解決しました。
OMID 2017年

どのようにそれを解決しましたか..?
ラファエル

4
services.AddIdentityの@Lobatoは、IdentityUserをIdentity Userクラスに置き換えるだけです
OMID 2017

1
@OMID回答としてコメントを投稿してみませんか。これで助かりましたが、RnDの深刻な頭痛の種でした。–
Null Pointer

回答:


92

SignInManager、UserManager、services.AddIdentityで同じユーザーデータモデルを使用する必要があります。独自のカスタムアプリケーションロールモデルクラスを使用している場合も、同じ原則が当てはまります。

だから、変更

services.AddIdentity<IdentityUser, IdentityRole>(options =>
    {
        options.User.RequireUniqueEmail = false;
    })
    .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
    .AddDefaultTokenProviders();

services.AddIdentity<Automobile.Models.Account, IdentityRole>(options =>
    {
        options.User.RequireUniqueEmail = false;
    })
    .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
    .AddDefaultTokenProviders();

2
同様の問題があります。顧客のユーザーとロールがAddIdentityメソッドで定義されていますが、それでも同じエラーが発生します。理由は何ですか?コードを別のスレッドに投稿することもできます。
devC 2018年

1
実際、私はその問題を解決しましたが、DB接続の作成で問題に直面しています。問題を投稿します。
devC 2018年


接続文字列が正しく設定されていないようです。投稿の私の回答を確認してください。
HojjatK

50

答えを明確にするために:

ApplicationUserstartup.csでクラスを使用する場合:services.AddIdentity<ApplicationUser, IdentityRole>()

次に、それを注入するときに、コントローラーで同じクラスを使用する必要があります。

public AccountController(UserManager<ApplicationUser> userManager)

次のような他のクラスを使用する場合:

public AccountController(UserManager<IdentityUser> userManager)

次に、このエラーが発生します。

InvalidOperationException:タイプ 'Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]'のサービスを解決できません

ApplicationUser起動時に使用したIdentityUserため、このタイプは噴射システムに登録されていません。


6
これはすべての参照にカウントされるため、asp.netコア2.1の新しいRazor IDを実装して古いIDシステムを置き換える場合は、SignInManager <IdentityUser>などの自動実装をSignInManager <ApplicationUser>に置き換える必要があります。これは煩わしい場合があります。また、通常の/ Account / Loginから/ Identity / Account / Loginなどに再ルーティングする必要があります。役立つヒント;)
Johan Herstad 2018年

16

これは元の投稿とは少し関係ありませんが、Googleがあなたをここに連れてくるので...このエラーが発生して使用している場合:

services.AddIdentityCore<YourAppUser>()

次に、実行するものを手動で登録する必要がありますAddIdentity。これは、https//github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityServiceCollectionExtensions.cs#L79にあります。

        services.AddHttpContextAccessor();
        // Identity services
        services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
        services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
        services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
        services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
        services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();
        // No interface for the error describer so we can add errors without rev'ing the interface
        services.TryAddScoped<IdentityErrorDescriber>();
        services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
        services.TryAddScoped<ITwoFactorSecurityStampValidator, TwoFactorSecurityStampValidator<TUser>>();
        services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();
        services.TryAddScoped<UserManager<TUser>>();
        services.TryAddScoped<SignInManager<TUser>>();
        services.TryAddScoped<RoleManager<TRole>>();

あなたは交換する必要がありますTUserし、TRoleあなたのそれらの実装、またはデフォルトでIdentityUserIdentityRole


カスタムSignInManagerを作成する必要があり、これで修正されました。そうする予定がある場合は、github.com
dotnet /

私はもともとこのルートから始めましたが、ここ(stackoverflow.com/a/60752194/1146862)で解決策を見つけました。唯一私が再発注後(しなければならなかった変更AddIdentityAddJwtBearer私は使っていたい、例に示されているすべての3つのオプションを設定することでしたDefaultAuthenticationScheme私はまだログインにクッキーを取り戻すが、。[Authorize]今指定せずにJWTトークンのために働きますAuthenticationSchema。
アーロン

これはまさに私が欠けていたものです。Startup.csにとを追加するTryAddScoped<UserManager<TUser>>();services.TryAddScoped<SignInManager<TUser>>();、問題が修正されました。
MorganR

4

ConfigureServicesにロールマネージャーを追加することを忘れないでください

services.AddDefaultIdentity<IdentityUser>()
    .AddRoles<IdentityRole>() // <--------
    .AddDefaultUI(UIFramework.Bootstrap4)
    .AddEntityFrameworkStores<ApplicationDbContext>();

3

以下に示すように、Startupクラス内のConfigureServicesでIdentityUserとIdentityRoleを個別に設定できます。

services.AddDefaultIdentity<IdentityUser>()
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

または

AddIdentityに直接構成できます。

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

4
コードのみの回答では、OPや他の人は問題についてほとんど学習しません。回答を編集して説明を追加することを検討してください
Cleptus 2010

0

「IdentityServer」を使用しているため、IdentityServerがユーザーを認証し、クライアントを承認する場合。デフォルトでは、IdentityServerは実際にはユーザー管理に関するものではありません。ただし、asp.netIdentityにはいくつかのサポートがあります

だからあなたは追加する必要があります:

services.AddIdentityServer()
    .AddAspNetIdentity<ApplicationUser>();

0

Statup.csクラスを以下で更新する必要があります

services.AddIdentity <ApplicationUser、IdentityRole>()。AddEntityFrameworkStores();

ここで:ApplicationUserは私のカスタムモデルクラスです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.