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をコピーしました。カスタム・ユーザー・ストアを作成する必要があり
@ johnny5だから、それは価値がないようです。私は、ApplicationDbContextとMigrationsとMicro ORMを使用しているすべてのものを使用して、AspNetIdentityの情報を保持していると思います。これは理にかなっていますか? –
私はトークンサーバーをホストしていて認証していますが、Identity Server 4をチェックアウトできますが、残念ですがログインプロセスが抽象化されています –
@ johnny5 Identity Identity4 with ASP.NET Identityを使用しています。 https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity。このプロジェクトではEFとマイグレーションを使用しています...どうすればいいですか? –