ASP .NETコアID(Entity Frameworkカスタム)DbContext

asp.net-core asp.net-core-identity entity-framework-core

質問

私は、ASP.NET Core IdentityとEntity Frameworkでドキュメントを読んでみました。しかし、私はまだ賢明ではないと感じています。

私はIdentityDbContextIdentityUserIdentityRoleと何も関係がありません。私は自分のDbContext実装を使い、 UserManagerUserStoreRoleManagerSignInManager 、そしてサインインに関わる他のクラスをSignInManagerたいと思っています。

つまり、「個人ユーザーアカウント」を使用する既定のASP.NETコアプロジェクトを作成したということです。今、私はDIワイヤアップがそのコントローラが "働く"ために必要とされるものを理解したいと思います。

アカウントコントローラのコンストラクタを見て:

public AccountController(UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,
        IOptions<IdentityCookieOptions> identityCookieOptions,
        IEmailSender emailSender,
        ISmsSender smsSender,
        ILoggerFactory loggerFactory)

それに伴い、以下の関連クラスが生成されます。

public class ApplicationUser : IdentityUser
{
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    ...
}

そしていくつかの関連するDI設定:

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

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

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

ASP.NET Core Identityのソースコードを掘り下げて、UserStoreはIdentityUser制約を強制します。

public class UserStore : UserStore<IdentityUser<string>>

私が仕事をしたいのは、次のようなものです。まずは:

public class AuthenticationDbContext : DbContext
{
    public AuthenticationDbContext(DbContextOptions options) : base(options)
    {
    }

    public DbSet<ApplicationUser> ApplicationUsers { get; set; }
    public DbSet<ApplicationRole> ApplicationRoles { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<ApplicationUser>(te =>
          te.HasKey(user => user.Id));

        builder.Entity<ApplicationRole>(te =>
          te.HasKey(role => role.Id));
     }
}

public class ApplicationRole
{
    public int Id { get; set; }
    public string UserName { get; set; }
}

public class ApplicationUser
{
    public int Id { get; set; }
    public Guid Guid { get; set; }
    public string GivenName { get; set; }
    public string FamilyName { get; set; }
    public string MiddleName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public string UserName { get; set; }
    public string EmailAddress { get; set; }
}

私が持っていた問題、例外などを列挙すれば、この投稿は長すぎるだろう。

問題は、これをDI構成でどのように結び付けるかです。

人気のある回答

OK。 AuthenticationDbContextを同じに保つことに続き、 IUserStoreIRoleStore実装を提供し、DIを次のように構成することができます。

public class ApplicationUserStore : IUserStore<ApplicationUser>, IUserPasswordStore<ApplicationUser>
{
    private readonly AuthenticationDbContext _dbContext;

    public ApplicationUserStore(AuthenticationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    ...

ここでは10〜11のメソッドの実装を提供する必要があります。 ApplicationRoleStoreも同様です。

public class ApplicationRoleStore : IRoleStore<ApplicationRole>
{
    private AuthenticationDbContext _dbContext;

    public ApplicationRoleStore(AuthenticationDbContext context, IdentityErrorDescriber describer = null) 
    {
        _dbContext = context;
    }

    ...

それから、これは次のものと結びつくことができます:

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, ApplicationRole>()
        .AddUserStore<ApplicationUserStore>()
        .AddRoleStore<ApplicationRoleStore>()
        .AddDefaultTokenProviders();

     services.AddTransient(c =>
            new AuthenticationDbContext(
                new DbContextOptionsBuilder()
                    .UseSqlServer(Configuration.GetConnectionString("DefaultConnection")).Options));

Account Controller / Loginビューでサインインすると、LoginをクリックするとApplicationUserStore.FindByNameAsyncが呼び出されるようになりました。

これがそうであるか否かにかかわらず、「適切な」ものはまだ見えていない。私は、ASP.NET IDが「任意の」データストア実装で動作することを強く感じています。したがって、 IdentityUserを使用するように制約する必要はありません。上記のことは、私が感じている非Entity Frameworkの実装では機能するはずです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ