デフォルトでは、VS 2015のASP.NET Identityは、AspNet ***テーブルのプライマリキーとして文字列を使用します。代わりに、int型のIDを使用したかったのです。いくつかの調査の結果、フレームワークによってすぐに使用できるさまざまな型付きIDがサポートされていることがわかりました。以下の回答では、それを達成するためにどのような変更を加えるかを示します。
更新:回答を追加した後、asp.netサイトで同じ(ただしより包括的な)を説明するこのブログ投稿を見つけました: http://www.asp.net/identity/overview/extensibility/change -aspnet-identityのユーザーのプライマリキー
_IdentityModels.cs
_変更:
_// New derived classes
public class UserRole : IdentityUserRole<int>
{
}
public class UserClaim : IdentityUserClaim<int>
{
}
public class UserLogin : IdentityUserLogin<int>
{
}
public class Role : IdentityRole<int, UserRole>
{
public Role() { }
public Role(string name) { Name = name; }
}
public class UserStore : UserStore<ApplicationUser, Role, int,
UserLogin, UserRole, UserClaim>
{
public UserStore(ApplicationDbContext context): base(context)
{
}
}
public class RoleStore : RoleStore<Role, int, UserRole>
{
public RoleStore(ApplicationDbContext context): base(context)
{
}
}
// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.Microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser<int, UserLogin, UserRole, UserClaim>
{
public DateTime? ActiveUntil;
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, Role, int,
UserLogin, UserRole, UserClaim>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
_
`App_Start\IdentityConfig.csで、次のクラスを変更します。
_public class ApplicationUserManager : UserManager<ApplicationUser, int>
{
public ApplicationUserManager(IUserStore<ApplicationUser, int> store)
: base(store)
{
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser, int>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 8,
// RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Configure user lockout defaults
manager.UserLockoutEnabledByDefault = true;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
manager.MaxFailedAccessAttemptsBeforeLockout = 5;
// Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
// You can write your own provider and plug it in here.
manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<ApplicationUser, int>
{
MessageFormat = "Your security code is {0}"
});
manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<ApplicationUser, int>
{
Subject = "Security Code",
BodyFormat = "Your security code is {0}"
});
manager.EmailService = new EmailService();
manager.SmsService = new SmsService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<ApplicationUser, int>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
}
// Configure the application sign-in manager which is used in this application.
public class ApplicationSignInManager : SignInManager<ApplicationUser, int>
{
public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager)
: base(userManager, authenticationManager)
{
}
public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
{
return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
}
public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context)
{
return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication);
}
}
_
_App_Start\Startup.Auth.cs
_で、OnValidateIdentity
プロパティを次のように変更します。
_OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: id => id.GetUserId<int>())
_
ManageControllerを変更して、新しいpkタイプで動作するようにします。
User.Identity.GetUserId()
のすべてのエントリをUser.Identity.GetUserId<int>()
に置き換えます
id
に変更する必要がある文字列int
引数がいくつかあるかもしれませんが、それはそれだけです。
このブログ投稿 ごとに、ASP.NET Core Identityを使用して、次の変更を行います。
まず、Data\Migrations
フォルダーに移動し、そこにあるものをすべて削除します。
Startup.cs
のConfigureServices
メソッドで、services.AddIdentity
を
services.AddIdentity<ApplicationUser, IdentityRole<int>>()
.AddEntityFrameworkStores<ApplicationDbContext, int>()
.AddDefaultTokenProviders();
ApplicationDbContext.cs
で、ベースクラスをIdentityDbContext<ApplicationUser>
から
public class ApplicationDbContext
: IdentityDbContext<ApplicationUser, IdentityRole<int>, int>
最後に、ApplicationUser.cs
の基本クラスをIdentityUser
からに変更します
public class ApplicationUser : IdentityUser<int>
次に、add-migration -o Data\Migrations
およびupdate-database
を実行します。移行によって問題が発生する場合は、SQL Server Management StudioまたはVSのSqlServerObjectExplorerを使用してデータベースを削除します(do n'tだけでファイルシステムを使用します)、移行を再度削除して、もう一度お試しください。