2017-06-22 20 views
1

Entity FrameworkおよびEntity Frameworkの移行なしでASP.NET IDを使用することは可能ですか?残りのアプリケーションでは、データアクセスにMicro ORMを使用します。ただし、アプリケーションでは、ASP.NET ID個別ユーザーアカウントが組み込まれています。Entity Frameworkおよび移行のないASP.NETコアMVCアプリケーションでのASP.NET IDの使用

私の目標は、組み込みのUserManagerクラスとLoginManagerクラスを使用し、さらにMicro ORMを使用しているユーザーのリストを取得し、EF/Migrationと何も関係がなくなるようにすることです。これは可能ですか?最初の移行を適用することで元のデータベース構造が作成されているため、このようには見えません。

誰かがこれを行うための優れたテクニックを持っている場合は、共有してください。

+0

@ johnny5だから、それは価値がないようです。私は、ApplicationDbContextとMigrationsとMicro ORMを使用しているすべてのものを使用して、AspNetIdentityの情報を保持していると思います。これは理にかなっていますか? –

+0

私はトークンサーバーをホストしていて認証していますが、Identity Server 4をチェックアウトできますが、残念ですがログインプロセスが抽象化されています –

+0

@ johnny5 Identity Identity4 with ASP.NET Identityを使用しています。 https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity。このプロジェクトではEFとマイグレーションを使用しています...どうすればいいですか? –

答えて

2

まず:

public class UserStore : IUserStore<IdentityUser>, 
         IUserClaimStore<IdentityUser>, 
         IUserLoginStore<IdentityUser>, 
         IUserRoleStore<IdentityUser>, 
         IUserPasswordStore<IdentityUser>, 
         IUserSecurityStampStore<IdentityUser> 
{ 
    // interface implementations not shown 
} 

は、その後、依存性注入コンテナにそれを登録する必要があります。

// Add identity types 
services.AddIdentity<ApplicationUser, ApplicationRole>() 
    .AddDefaultTokenProviders(); 

// Identity Services 
services.AddTransient<IUserStore<ApplicationUser>, CustomUserStore>(); 
services.AddTransient<IRoleStore<ApplicationRole>, CustomRoleStore>(); 

これはdocumented hereです。

0

Asp.Net Identityは、必要な店舗を抽象化し、店舗のドキュメントはこちらです。
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-custom-storage-providers

これは店舗の例です。

public class InMemoryUserStore<TUser> : 
     IUserStore<TUser>, 
     IUserLoginStore<TUser>, 
     IUserClaimStore<TUser>, 
     IUserPasswordStore<TUser>, 
     IUserSecurityStampStore<TUser>, 
     IUserTwoFactorStore<TUser>, 
     IUserEmailStore<TUser>, 
     IUserLockoutStore<TUser>, 
     IUserAuthenticatorKeyStore<TUser>, 
     IUserTwoFactorRecoveryCodeStore<TUser>, 
     IUserPhoneNumberStore<TUser> where TUser: MemoryIdentityUser 
    { 
     ... 
    } 

独自のUserオブジェクトを持つこともできますし、何も継承する必要はありません。

public class MemoryIdentityUser 
{ 
    private List<MemoryUserClaim> _claims; 
    private List<MemoryUserLogin> _logins; 
    private List<MemoryUserToken> _tokens; 
    ... 
} 

Asp.Net Identityはエンジンであり、そのように意見があります。それは、店舗の抽象化を推進した意見です。私は、Asp.Net Identityのドキュメントに店舗とのやりとりに関する完全なシーケンス図があることを願っています。最低でも、いくつかの参照配列を受けなければならない。

ストアには、インプリメンテーションのプライベートデータを変更するだけのメソッドが必要ないくつかの欠点があります。その後、そのデータを永続ストレージにコミットすると仮定した更新呼び出しが続きます。

このプロジェクトをチェックアウトすることができます。 https://github.com/ghstahl/AspNetCore.2.InMemoryIdentity

あなたはデータベースを持つ負担なしで何をする必要があるか分かります。

フックアップ;

// My user is custom, so I made ApplicationUser inherit 
public class ApplicationUser : MemoryIdentityUser 
{ 
} 

Startup.cs; AddIdentityで

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddSingleton<IUserStore<ApplicationUser>>(provider => 
    { 
    return new InMemoryUserStore<ApplicationUser>(); 
    }); 
    services.AddIdentity<ApplicationUser>(Configuration) 
      .AddDefaultTokenProviders(); 

    // Add application services. 
    services.AddTransient<IEmailSender, EmailSender>(); 

    services.AddMvc(); 
} 

は、以下のバッキングデータベースの種類ごとに、そこにIUserStore実装の束があります

public static class InMemoryIdentityServiceCollectionExtensions 
{ 
    public static IdentityBuilder AddIdentity<TUser>(this IServiceCollection services, IConfiguration configuration) 
     where TUser : class => services.AddIdentity<TUser>(configuration,null); 

    public static IdentityBuilder AddIdentity<TUser>(this IServiceCollection services, IConfiguration configuration,Action<IdentityOptions> setupAction) 
     where TUser : class 
    { 
     // Services used by identity 
     var authenticationBuilder = services.AddAuthentication(options => 
      { 
       options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme; 
       options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme; 
       options.DefaultSignInScheme = IdentityConstants.ExternalScheme; 
      }) 
      .AddCookie(IdentityConstants.ApplicationScheme, o => 
      { 
       o.LoginPath = new PathString("/Account/Login"); 
       o.Events = new CookieAuthenticationEvents 
       { 
        OnValidatePrincipal = SecurityStampValidator.ValidatePrincipalAsync 
       }; 
      }) 
      .AddCookie(IdentityConstants.ExternalScheme, o => 
      { 
       o.Cookie.Name = IdentityConstants.ExternalScheme; 
       o.ExpireTimeSpan = TimeSpan.FromMinutes(5); 
      }) 
      .AddCookie(IdentityConstants.TwoFactorRememberMeScheme, 
       o => o.Cookie.Name = IdentityConstants.TwoFactorRememberMeScheme) 
      .AddCookie(IdentityConstants.TwoFactorUserIdScheme, o => 
      { 
       o.Cookie.Name = IdentityConstants.TwoFactorUserIdScheme; 
       o.ExpireTimeSpan = TimeSpan.FromMinutes(5); 
      }); 

     // Hosting doesn't add IHttpContextAccessor by default 
     services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

     // Identity services 
     services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>(); 
     services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>(); 
     services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>(); 
     services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>(); 

     // 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<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser>>(); 
     services.TryAddScoped<UserManager<TUser>, AspNetUserManager<TUser>>(); 
     services.TryAddScoped<SignInManager<TUser>, SignInManager<TUser>>(); 

     if (setupAction != null) 
     { 
      services.Configure(setupAction); 
     } 

     return new IdentityBuilder(typeof(TUser), services); 
    } 
} 

あなたが独自の実装にもたらすことができる範囲で示しています。 MongoDBをバッキングDBとして使用していた別のプロジェクトからInMemoryUserStoreをコピーしました。カスタム・ユーザー・ストアを作成する必要があり

+1

のリンクのみの回答はお勧めできません。あなたはあなたの答えをもう少し詳しく説明して、あなたがリンクしたものを使う方法の例を挙げたり、もっと深く説明してください。 –

関連する問題